1

我正在使用 ORM(SQLAlchemy,但我的问题与实现无关)来模拟父类与其子类之间的多对多关系。我想知道,表达这个概念的简单方法是什么“其中一个孩子是默认/主要的”?

例如,我需要坚持以下内容:
这个 Person 实例有地址 X 和 Y,主要的是 Y。

我看到这是使用像“PersonAddressRelation”这样的“中间”类实现的,它包含“Person”、“Address”和“main”标志,但我认为它看起来有点麻烦..有更好的方法吗?

4

2 回答 2

2

最简单的方法是在 Person 表上创建一个连接表 PersonAddressRelation 和一个 DefaultAddress 列,该列作为 Address 表的键。

于 2009-01-12T13:53:00.607 回答
1

几点评论。

  • M:N 关系没有指定“父”和“子”,因为没有父或子:只有两个实体通过第三个实体(中间实体)具有 m:n 关系。

  • “地址”通常不是有效的实体类型,因为在语义上它没有身份,类似于“姓名”没有身份(名字,姓氏)。当您查看重用地址类型的实体实例时,您会看到这一点:您通常不会这样做。(尽管您将重新使用客户实体实例,例如,当客户有多个订单时)

  • 您想在 M:N 关系(默认)上指定一个属性,因为它属于那里。这意味着关系本身形成了一个实体(它是中间实体,通常它只有两个 FK 字段形成 PK)。这被称为“对象化关系”,因为关系本身被视为一个实体。这方面的其他示例是 Employee m:n Department,您希望指定员工开始为员工工作的部门的 StartDate。

所以一般来说:创建中间实体,因为它通常应该在那里,并在那里添加属性。在这种使用地址的特殊情况下,请确保您在相关实体(人)之间重复使用地址实例。如果不是,则将地址与人员合并,或者如果一个人可以有多个地址,则在人员-地址之间创建一个简单的 1:n 关系,将其规范化,但不要害怕将地址数据合并到与之相关的实体中,通常地址数据实际上没有被重复使用(因此您的 m:n 关系实际上不存在:没有与多个人员实例相关的 Address 实例。

于 2009-01-12T14:03:23.207 回答