我正在构建一个需求模糊的应用程序。最初,我有一张桌子,用来锁定一根弦。
表格
SpecialCode varchar(10)
描述varchar(50)(PK)
somevalue int
最初,SpecialCode可能是null
。但是,使用Description将SpecialCode作为主键的一部分会有所帮助。现在,描述不再是唯一的。所以,我继续将SpecialCode作为密钥的一部分并给它一些虚假的默认值。
当然,现在必须在处理流程中进一步考虑虚假值。
回顾过去,如果我插入任意种子身份,我认为这一切都会更好。但是,我选择不这样做,因为我听到很多人说没有意义的钥匙是一种不好的做法。
但是,我可以用这个毫无意义的钥匙来保护自己不受改变的要求。对于这个场景来说,无意义的种子身份是不是很好的做法?有没有更好的设计来解释我应该做的这些问题呢?
答案 0 :(得分:2)
人们强烈反对代理ID往往是最好的设计。我发现自然键通常并不是真正独一无二的,即使你认为它们会存在,如果它们是,它们经常变化,它们会导致很多额外的数据库工作,以便在子表中更新它们。使用整数加上连接速度更快(尽管一些自然键可以让你避免一些连接)。这可能在很大程度上取决于您通常看到的数据类型,但如果存在自然键,我更倾向于使用具有唯一索引的代理键。
答案 1 :(得分:1)
您仍然可以在此表中添加Identity Seed键。它不会损害任何现有代码,并允许您对代码进行现代化。
我总是使用存储过程。当我最终扩展表格设计时,我制作了所有存储过程的编号副本。例如:
spAddDescription (original) spAddDescription01 (revision 1) spAddDescription02 (revision 2) spUpdateDescription (original) spUpdateDescription01 (revision 1) spUpdateDescription02 (revision 2)
这让我可以保持生产中的工作,但仍然可以慢慢整合修改。通常,修订号越高意味着最近的变更已被纳入。