我正在使用ORM(SQLAlchemy,但我的问题与实现无关)来模拟父类与其子类之间的多对多关系。我想知道,这将是一个简单的方法表达“其中一个孩子是默认/主要的孩子”的概念?
例如,我需要坚持以下内容:
此Person实例具有地址X和Y,主要是Y.
我看到这个实现使用像“PersonAddressRelation”这样的“中间”类,其中包含“Person”,“Address”和“main”标志,但我觉得它看起来有点麻烦..有更好的方法吗?
答案 0 :(得分:2)
最简单的方法是在Person表上创建一个连接表PersonAddressRelation,以及一个键地址表的默认地址列。
答案 1 :(得分:1)
几句话。
M:N关系不指定'parent'和'child',因为没有父项或子项:只有两个实体通过第三实体(中间实体)具有m:n关系
'地址'通常不是有效的实体类型,因为它在语义上没有标识,类似于'名称'没有标识(名字,姓氏)。当你看到重新使用Address类型的实体实例时,你会看到这一点:你不会这样做。 (例如,当客户有多个订单时,您将重新使用客户实体实例)
您想要在M:N关系(默认)上指定属性,因为它属于那里。这意味着关系本身形成一个实体(它是中间实体,通常它只有两个形成PK的FK字段)。这被称为“客体化关系”,因为关系本身被视为一个实体。其他示例是员工m:n部门,您希望为员工工作的部门指定为员工启动的StartDate。
所以一般来说:创建中间实体,因为它通常应该存在,并在那里添加属性。在Address的这种特殊情况下,请确保您在相关实体(Person)中重用Address实例。如果没有,合并Address with Person或者如果一个人可以拥有多个地址,则在Person - Address之间创建一个简单的1:n关系,将其标准化,但不要害怕将地址数据合并到与之相关的实体中。 ,因为通常地址数据实际上没有被重用(所以你的m:n关系真的不存在:没有与多人实例相关的地址实例。