【发布时间】:2011-01-12 06:07:32
【问题描述】:
我的数据有点像这样......
Elements
Class | Synthetic ID (pk)
A | 2
A | 3
B | 4
B | 5
C | 6
C | 7
Elements_Xref
ID (pk) | Synthetic ID | Real ID (fk)
. | 2 | 77-8F <--- A class
. | 3 | 30-7D <--- A class
. | 6 | 21-2A <--- C class
. | 7 | 30-7D <--- C class
所以我有这些元素被分配了合成 ID 并被分组到类中。但是这些合成 ID 然后与我们真正关心的 Real IDs 配对。还有一个约束是 Real ID 不能在单个类中重复出现。如何在一个连贯的设计中捕捉所有这些?
我不想将Real ID 塞进上表,因为
- 它可以为空(有时我们不知道某事物的
Real ID应该是什么)。 - 它是更多数据的外键。
显然,这可以通过充当约束的触发器来完成,但我想知道这是否可以通过常规约束/唯一索引来实现。使用 SQL Server 2005。
我考虑过拥有两个主表 SyntheticByClass 和 RealByClass,然后将这些表的 ID 放入另一个外部参照/链接表中,但这仍然不能保证两个元素的类匹配。也可以通过触发器解决。
编辑:这是关键字填充,但我认为它与规范化有关。
Edit^2:如下面的 cmets 所示,我似乎暗示外键不能为空。这是错误的,他们可以!但是不能做的是在 NULL 重复的字段上设置唯一索引。尽管唯一索引支持 NULL 值,但它们不能在一个集合中约束多个 NULL。由于 Real ID 分配最初是稀疏的,因此每个类很可能有多个 NULL Real IDs。
编辑^3:删除了多余的Elements.ID 列。
编辑^4:一般观察。似乎有三种主要的方法在起作用,我已经提到了其中一种。
- 触发器。使用触发器作为约束来中断任何会破坏数据完整性的数据操作。
- 索引连接表的视图。太棒了,我不知道您可以使用视图和索引来做到这一点。
-
创建一个多列外键。 没想到这样做,不知道这是可能的。将
Class字段添加到Xref表中。在 (Class + Real ID) 上创建一个 UNIQUE 约束,在 (Class + Synthetic ID) 上创建一个外键约束,返回到Elements表。
【问题讨论】:
标签: sql sql-server database normalization