我对与此处描述的场景类似的场景有疑问: SQL:实体属于(多对一)两个不同实体之一
假设我了解了表格Party
和所有其他引用它的内容。但我很好奇想知道表格中列的PartyType
需要是什么Name
?我的意思是,它只是保留“Person”或“Organization”varchar?
同样,在Party
表格中,列是做什么Name
用的?
而且,表格PartyType
到底有什么用呢?我的意思是,它只是为了有一个地方插入所有类型,更重要的是确保在插入时,如果有错误PartyTypeCd
(表中不存在PartyType
),我们会收到错误,对吗?
另一个问题是,您将如何插入Organization
或Person
?看到建议的架构,Organization
和Person
表有自己的 ID(分别为PersonId
和OrganizationId
),它们引用表PartyId
中的Party
。那么,这是否意味着我们应该首先在表Person
中插入一个新的(例如)Party
?如果是这种情况,表中的列AUTO INCREMENT
上是否应该有一个,以便我们确保不会得到具有相同 ID 的组织和人员?PartyId
Party
因为,PartyId
不能成为唯一的主键。 表中的主键Party
应该是和 的组合键。PartyTypeCd
PartyId
我的情况与上面链接的问题类似。仅供参考,这里有一个小的架构示例。
基本上,我遇到这样一种情况,即一个Component
(具有自己的列,如component
、和price
)可以与User_Brand
一个或一个相关联System_Brand
(两者都有自己独特的列和字段,我已经从屏幕截图中排除了这些列和字段...因此将它们合并到一个type
带有列的表中不是一个解决方案)。
正如您正确判断的那样,使用子类型的标准方法是可行的方法。
是的,以及您将来可能添加的所有其他类型。如果您认为不需要它,请不要使用它,但为什么不在旁边包含一些关于每个 PartyTypeCd 的更多描述性信息呢。
这是一个完全不同的情况,链接的答案在这方面是不完整的。我认为意图是将
Name
代理替换为 PK 的实际“自然”密钥PartyId
。它仍然是备用密钥,应该具有唯一约束。您需要它的原因与您在其他地方需要密钥的原因相同,代理本身是无用的。是的。
是的,您需要插入基类型 Party,然后插入子类型 Person/Organization。
PartyId
是唯一的。PartyId
是PersonId
或OrganizationId
,但无论哪一个都是唯一的。您不可能获得具有相同 ID 的组织和人员。您链接到的答案中包含更多信息。