【发布时间】:2011-11-02 14:46:42
【问题描述】:
出于各种原因,我决定使用代理键(以种子身份的形式)。我的问题来自强制数据唯一性。例如,假设我正在创建一个数据库来存储图书馆中的所有书籍。
isbn 是分配给来自图书出版界某个神奇来源的所有图书的唯一标识符。如果这本书是印刷的,它有 1 个 isbn,如果它是电子的,它有另一个 ISBN。
如果不放置一个覆盖打印的ISBN 和ElectronicISBN 列的uniqueIndex,我们就无法强制ISBN 具有唯一性。我的具体问题是,我们有这种情况,我们需要强制数据的唯一性,但我们使用代理主键,我们必须强制数据唯一性的唯一方法是在我们想要的列上放置唯一索引喜欢强制执行。 这似乎违反直觉,因为如果我们在整个设计过程中都遵循代理键方法,那么每个表都会有一个代理主键和一个唯一索引?这似乎很糟糕,我觉得我的设计能力还不足以找到“正确的答案”。在这些类型的场景中,答案是什么?
BookID INT IDENTITY (1,1) not null,
Title varchar(25) not null,
Author varchar(25) not null,
PrintISBN char(13) not null,
ElectronicISBN char(13) not null
【问题讨论】:
-
一个可能的答案是您将 ISBN 详细信息规范化到另一个表、BookID、ISBN、ISBNType、OtherMeta 字段 - 然后在 ISBN 上放置唯一约束就很简单了。
-
有道理。让主键是 isbn 有一个列是 isbn 类型,然后有另一个具有 typeID、ISBN 类型的表。只要我将其与以下类型相关联,这将允许我将任何类型的 guid 放在那里,所以如果他们推出“isbnMark”版本,我可以轻松适应它。
标签: sql