【问题标题】:Many-to-Many relationship that is different in both directions双向不同的多对多关系
【发布时间】:2018-03-07 14:45:37
【问题描述】:

我一直在这里浏览答案以及有关数据库结构的书籍,但我怀疑我未能成功找到答案是由于缺乏适当的术语。

我正在我的数据库中创建一个名为 Genres 的表。它有一个 ID 和与另一个表的关系:Books。但是,我想与自己建立另一种关系,其中某些 Genreschildren/parents 对于其他 Genres。有没有办法标记双向关系,使其具有“方向”? IE。以便我知道哪一对是 parent(= 包含),哪一对是 child(= 包含)?让我们假设任何给定的流派既可以是 parent 又可以是 child

如何用适当的术语来描述这种关系?

【问题讨论】:

    标签: database many-to-many relationship bidirectional


    【解决方案1】:

    如果我理解,您有 2 张桌子:

    类型

    • 身份证
    • parent_id
    • book_id

    书籍

    • 身份证

    最大的父级的 parent_genre_id 等于 null。

    你可以在这里找到一些文档:http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-self-referencing

    【讨论】:

    • 感谢您的文档,事实证明这是一本有趣的书。不仅有一个 parent_id 只会使找到孩子变得困难吗?我在想添加一个深度级别的列可以通过适当的限制来解决这个问题……
    • 如您在上面的文档中看到的,有一个“children”字段可以用来检索孩子(感谢Captain Obvious)如果需要更深入,您必须调用孩子为每个孩子。我认为为深度添加一列是一个非常糟糕的主意。
    • 这个解决方案意味着一种类型只有一个父级。如果您需要更多父级,则必须创建另一个表,例如Genres_x_genres,这将是多对多关系:docs.doctrine-project.org/projects/doctrine-orm/en/latest/…
    【解决方案2】:

    一种方法(不一定是最佳的)是只有一个 GenreSelfRelationship 列(或您想要的任何名称),0 表示既不是父母也不是孩子,1 表示孩子(仅限),2 表示父母(仅限),3 表示父母和孩子。当然,可能还有更好的方法。

    【讨论】:

    • 0 不是多余的吗?如果与任何父/子没有关系,那么 GenreSelfRelationship 中的此类行将不存在,对吗?
    • @MrVocabulary:取决于数据库设计;它被包括在内是为了完整性,但很明显,如果你想要,你可以不用它。
    猜你喜欢
    • 2017-11-11
    • 2013-04-13
    • 1970-01-01
    • 2016-09-07
    • 2013-01-14
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多