1

我有 3 个标有产品、个人和公司的表。现在,产品由公司或个人拥有,而不是两者兼有,并且始终由其中一个拥有。我要问的问题是我应该怎么做?

我是否会有第四个标有所有者的表,该表具有 companyID、ProductID、IndividualID 并允许 companyID 或 IndividualID 为空值。但这似乎会创建很多空值,我仍然必须只强制执行一个所有者。在这种情况下,所有这三个属性都是指向各自表的外键。这似乎不是一个很好的方法,但我想不出更好的方法。还有另一种方法吗?

4

1 回答 1

0

您无法使用 SQL 声明性引用完整性来强制执行您正在寻找的那种规则。

考虑个人和公司是否真的是一种“类型”的东西,或者它们是否至少具有一组可以在单个表中表示的核心属性(列)(对于特殊列之间的链接表是不相同的)两种实体)。如果是这样,请重构您的数据库,使这些常见元素位于该表中,并使用该表中的 id 作为 Product 表中的所有者 id。

如果您认为个人和公司如此不同以至于不能将它们组合成一个表,您可以使用第四个表的方法,或者您可以在代码中强制执行这种关系。您还可以选择切换到支持存储过程和触发器的数据库引擎,并在触发器中强制执行关系,但会以性能为代价。

于 2012-09-15T01:38:57.933 回答