【问题标题】:GoLang GORM Cyclical Binary TreeGoLang GORM 循环二叉树
【发布时间】:2021-05-07 19:35:19
【问题描述】:

我正在尝试使用 GORM (gorm.io/gorm v1.21.9) 在 GoLang (go 1.16) 中为数据库建模。

我的部分架构包括带有 2 个可选外键的表 A,实际上每条记录只使用 1 个。表 B 包含对表 A 的 2 个引用,例如二叉树。表C是一个叶子节点。

图 1. 实体关系图

图 2. 示例用法

我设置了如下所示的 GORM 代码。

type A struct {
    ID   string
    BID  *string
    B    *B
    CID  *string
    C    *C
}

type B struct {
    ID       string
    LeftAID  string
    LeftA    A
    RightAID string
    RightA   A
}

type C struct {
    ID string
}

当我使用示例数据加载应用程序时,表 B 的外键始终为空值。

但是,表 A 对于每条记录都有一个 table_b_id 值(当 table_c_id 存在时应该为空)。

我猜,由于表 A 有表 B 的外键,它在所有情况下都使用该关联,而不是选择 right_a_id 和 left_a_id 关联。是否有可以解决此问题的 GORM 注释,或者这是 GORM 固有的限制?

请注意,我已经删除了不相关的架构信息并使用了抽象的表/列名。

【问题讨论】:

  • 你声明了用于描述的gorm struct标签吗?
  • 不,我使用的是默认值,这个模式的正确结构标签是什么?
  • 看看GORM的文档,gorm.io/docs/many_to_many.html
  • 谢谢,在发布之前和之后,我一直在查看文档。我还没有找到任何有效的方法。我希望 SO 上的某个人之前已经看过这个并且知道一组适用于这种模式的标签。如果我在这里找不到答案,我将不得不修改我的架构。

标签: go go-gorm


【解决方案1】:

也许你应该使用 Self-Referential Has One Self-Referential Has One 喜欢关注

type A struct {
    ID   string
    LeftID  *string
    LeftA    *A `gorm:"foreignkey:LeftID"`
    RightID *string
    RightA    *A `gorm:"foreignkey:RightID"`
    LeafID *string
    LeafA    *A `gorm:"foreignkey:LeafID"`
}

测试代码:

func main() {
    db := config.CreateMysql()
    db.AutoMigrate(&A{})
    a1 := A{ID: "a1"}
    a2 := A{ID: "a2"}
    a3 := A{ID: "a3"}
    a4 := A{ID: "a4"}
    a5 := A{ID: "a5"}

    a1.LeftA = &a2
    a1.RightA = &a3

    a4.LeafA = &a5

    db.Create(&a1)
    db.Create(&a4)
}

在数据库中像这样:

【讨论】:

  • 感谢您对此进行调查!我在文档中看到了这种结构,我希望我可以使用它。不幸的是,我的一些其他要求需要使用 2 个单独的表,这就是问题所在。我是 gorm 的新手,我找不到任何带有正确标签的文档来使我的架构正常工作。
猜你喜欢
  • 2015-05-16
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 2019-07-31
相关资源
最近更新 更多