我试图用来在一个表中定义一对多的关系。例如,假设我有一个包含这些条目的Groups表:
Group: Group_1: name: Atlantic Records Group_2: name: Capital Records Group_3: name: Gnarls Barkley Group_4: name: Death Cab For Cutie Group_5: name: Coldplay Group_6: name: Management Company
Coldplay集团可能是Capital Records集团的子女,也是集团管理公司的子女,而Gnarls Barkley只能成为Atlantic Records的孩子。
表达这种关系的最佳方式是什么。我正在使用PHP和mySQL。我也使用PHP-Doctrine作为我的ORM,如果有帮助的话。
我在想我需要创建一个名为group_groups的链接表,该表有2列。 owner_id和group_id。但是我不确定这是否是最好的方法。
任何见解都将受到赞赏。如果我解释好我的问题,请告诉我。
答案 0 :(得分:7)
这种方法存在许多可能的问题,但是对要求的理解很少,这里有:
这里似乎有三个'实体':艺术家/乐队,标签/录音公司和管理公司。
艺术家/乐队可以拥有标签/录制CO 艺术家/乐队可以拥有管理公司。
Label / Recording Co可以有多个艺术家/乐队
管理公司可以有多个艺术家/乐队
因此,唱片公司和艺术家之间以及管理公司和艺术家之间存在一对多的关系。
使用唯一ID在自己的表中记录每个实体一次。
将“one”的密钥放在“many”的每个实例中 - 在这种情况下,Artist / Band将同时具有Recording Co ID和Management Co ID
然后您的查询将最终加入Artist,Recording Co和Management Co.
使用这种结构,您不需要交集表,有明确的“实体”分离,查询相对简单。
答案 1 :(得分:3)
有两种选择:
最简单:如果每个组只能有一个父级,那么您只需要在主表中使用“ParentID”字段。
如果关系可能比那更复杂,那么是的,你需要某种链接表。甚至可能是“关系类型”列来定义两组之间关系的种类。
答案 2 :(得分:1)
在这个特定的例子中,你明智地遵循Ken G的建议,因为你确实在一个表中建模了三个独立的实体。
一般情况下,这可能会出现 - 如果你有一个“人”表并且正在模拟每个人的朋友是谁,那是一个人为的例子。
在这种情况下,您确实会有一个“链接”或关联或婚姻表来管理这些关系。
答案 3 :(得分:0)
我同意Ken G和JohnMcG您应该将管理和标签分开。然而,他们可能忘记了一个乐队在一段时间内可以拥有多个经理和/或多个经理。在这种情况下,你需要多对多的关系。
在这种情况下,您使用关系表的原始想法是正确的。这是家庭多对多的关系。但是,group_groups可以更好地命名。
最终它将取决于您的要求。例如,如果您正在存储CD标题,那么您可能更愿意将标签附加到特定CD而不是乐队。
答案 4 :(得分:0)
这似乎是STI(单表继承)和嵌套集/树结构的混合。嵌套集/树是多个子节点的父节点之一:
http://jgeewax.wordpress.com/2006/07/18/hierarchical-data-side-note/
答案 5 :(得分:0)
我认为最重要的是使用NestedSet http://www.doctrine-project.org/documentation/manual/1_0/en/hierarchical-data#nested-set
只需设置actAs NestedSet
即可答案 6 :(得分:-1)
是的,你需要一个包含你描述的字段的桥。但是,如果它跟随你描述的相同类型的实体,我认为你的表应该被拆分。
答案 7 :(得分:-1)
(我假设有一个可用于参考的id列。)
您可以添加名为parent_id(允许空值)的列,并在其中存储父组的ID。然后你可以使用sql加入:“在parent.id = child.parent_id上从组父联接组子项中选择一个。,b。”。
我建议为此链接使用单独的表,因为: 1.你不能支持有一个领域的多个父母。你必须使用一个单独的表。 2.使用表中的字段导入/导出/删除更加困难,因为您可能会遇到关键冲突。例如,如果您尝试导入数据,则需要确保首先导入父项,然后导入子项。使用单独的表,您可以导入所有组,然后导入所有关系,而无需担心数据的实际顺序。