我在5个可为空的列上有唯一的约束,它们代表一行的标识符。 可以创建唯一键并在其上创建聚簇索引而不是主键吗?我不能在这些列上使用主键,因为它们可以为空,并且我不能创建身份列,因为有很多删除和插入操作,这会在此身份列上造成溢出。
答案 0 :(得分:0)
是的,并且存在这样一种论点,即它实际上比主键“更好”,因为主键列不可为空的规则在许多方面都是人为约束。
如果将其设置为UNIQUE CLUSTERED INDEX
,则除了将列必须不可为空的不需要的规则外,您几乎可以获得主键带给表的所有内容。但是,它们仍然必须是唯一的,因此您只能有一行,例如索引中的所有五列均为空。
因此,您可以在创建外键约束时使用索引,这将确保存储订单数据,并且每一行都必须是唯一的。但是,索引可能不会对查询有用,并且因为索引会很宽,并且您说有很多删除/插入操作,因此有将数据碎片化的趋势。
就我个人而言,我很想使其成为唯一的约束,但不能聚集在一起。然后它将执行防止创建非唯一数据的工作。
然后,您可以添加代理密钥并将其用作主密钥。我怀疑您这样做的数字会“用完”(或“溢出”吗?)。
那我为什么要使用代理密钥?
您的代理密钥将更窄,因此插入/更新/删除的次数过多,因此碎片产生的影响较小。
如果您需要扩展数据库,则很有用。假设您只有一个表,并且它将始终是整个数据库中的唯一表。在这种情况下,不必理会代理密钥是有意义的。它没有任何价值。这只是不必要的开销。
但是,我们假设您还有其他悬挂在“主”表上的表(具有5列的表构成唯一键)。在此处添加代理键使您可以创建具有链接回父表的单个ID的任何子表。替代方法是在每次创建子表时强制添加构成唯一(候选)键的所有五列。
现在,您拥有一个狭窄的聚集索引,该索引实际上可以满足一定的目的,并且碎片的情况不会像五列那样严重。