我有一个没有任何自然主键的实体。唯一行由三列标识,其中任何一列可以具有唯一值,其他列将为空。
为了举一个假想的例子,这是我的实体:
--------
Product
--------
Shelf
Order
Customer
Category
--------
只有“货架”或“客户订单”或“类别”列之一具有填充值,可能带有 ID(不会是另一个表中的 FK)。
我如何为它设计一个表格?我严格需要仅在这些列上识别唯一行。如果有帮助的话我正在使用 Oracle DB。
我有一个没有任何自然主键的实体。唯一行由三列标识,其中任何一列可以具有唯一值,其他列将为空。
为了举一个假想的例子,这是我的实体:
--------
Product
--------
Shelf
Order
Customer
Category
--------
只有“货架”或“客户订单”或“类别”列之一具有填充值,可能带有 ID(不会是另一个表中的 FK)。
我如何为它设计一个表格?我严格需要仅在这些列上识别唯一行。如果有帮助的话我正在使用 Oracle DB。
你很可能不能。
那真是一场精彩的表演。尽管您可以在这 4 列上创建唯一的组合键,但在您尝试插入已包含该组合的另一行之前,一切都会正常。
例如:
该行失败,因为这样的组合已经存在(这是我插入的第一行)。
如果你同意——我的意思是,你确实期望这样的事情发生——那么它就会起作用。如果没有,就不会。
您可以通过创建唯一约束(而不是主键)来做到这一点。唯一约束允许其列成员可以为 NULL,将 NULL 视为不同的值。当可空列是某种状态/货币指示符时(例如 NULL
end_date
可以表示历史类型 2 表中当前活动的行,并且约束强制没有实体具有多个 NULLend_date
,即,多个活动/当前行)。如果你想创建一个约束,你会说:但是,您的特殊情况不适合这样做。老实说,我无法想象为什么你的设计中货架、订单、客户和类别都可以为空,也无法想象为什么你只在其中之一有识别值,也无法想象为什么具有识别值的列会移动大约。除了order之外,这些听起来都不像一个识别列,也不像它们的组合。如果只有其中一项有价值而其他则没有,这是没有意义的。这是一个明确的设计缺陷,应该通过重新设计表来纠正。
要么纠正您的设计,以便拥有正确的识别密钥,要么干脆不要尝试创建任何类型的密钥。表不必有约束。但我怀疑你可能应该修改设计,这样你就可以了。