Sql 如何为定义不清的实体设置关键帧?

Sql 如何为定义不清的实体设置关键帧?,sql,sql-server-2000,Sql,Sql Server 2000,我正在构建一个需求模糊的应用程序。最初,我有一张可以键入字符串的桌子 表格 特殊代码varchar(10) 说明varchar(50)(主键) somevalue int 最初,SpecialCode可以是null。但是,将SpecialCode作为带有描述的主键的一部分会有所帮助。现在,描述不再是唯一的。所以,我继续把SpecialCode作为键的一部分,并给它一些虚假的默认值 当然,现在必须进一步考虑加工管道上的伪值 回顾过去,我认为如果我加入了一个任意的种子身份,这一切都会变得更好。但是,

我正在构建一个需求模糊的应用程序。最初,我有一张可以键入字符串的桌子

表格
特殊代码varchar(10)
说明varchar(50)(主键)
somevalue int

最初,SpecialCode可以是
null
。但是,将SpecialCode作为带有描述的主键的一部分会有所帮助。现在,描述不再是唯一的。所以,我继续把SpecialCode作为键的一部分,并给它一些虚假的默认值

当然,现在必须进一步考虑加工管道上的伪值

回顾过去,我认为如果我加入了一个任意的种子身份,这一切都会变得更好。但是,我选择不这样做,因为我听到太多其他人说,没有意义的钥匙是一种糟糕的做法


但是,我本可以用这把毫无意义的钥匙来保护自己不改变需求。无意义的种子身份是这种场景的良好实践吗?是否有更好的设计来解决这些问题,而我本应该这样做?

人们同样强烈地认为代理ID通常是最好的设计。我发现,即使您认为自然键是唯一的,但它们通常也不是真正唯一的。如果它们是唯一的,那么它们会频繁更改,从而导致大量额外的数据库工作,以使它们在子表中保持更新。整数的加号连接速度更快(尽管某些自然关键点允许您避免某些连接)。这可能在很大程度上取决于您通常看到的数据类型,但我强烈希望在自然键上具有唯一索引的代理键(如果存在)。

您仍然可以将标识种子键添加到此表中。它不会损害任何现有代码,并允许您对代码进行现代化

我总是使用存储过程。当我结束扩展表设计时,我会对所有存储的进程进行编号拷贝。例如:

spAddDescription (original) spAddDescription01 (revision 1) spAddDescription02 (revision 2) spUpdateDescription (original) spUpdateDescription01 (revision 1) spUpdateDescription02 (revision 2) SPADDE说明(原件) spAddDescription01(第1版) spAddDescription02(第2版) spUpdateDescription(原件) spUpdateDescription01(修订版1) spUpdateDescription02(修订版2)
这使我能够在生产中保持工作,但仍然允许缓慢地集成修改。通常,修订号越高表示已纳入最新的更改

只有当存在另一个自然身份时,无意义的种子身份才是不好的,这似乎不是您的情况。而且,如果描述是密钥的一部分,则与该表建立外键关系也不太理想,imho。好建议。我加上去了。