SQl设计问题。唯一索引/约束与代理键

时间:2011-11-02 14:46:42

标签: sql

出于各种原因,我决定使用代理键(以种子身份的形式)。我的问题来自强制数据的唯一性。例如,在我创建数据库的场景中,将所有书籍存储在库中。

isbn是一个唯一的标识符,分配给图书出版界的某些神奇来源的所有图书。如果这本书被打印出来,那么它有1亿欧元,如果它是电子的,它还有另一种国际标准书号。

如果不使用包含printedISBN和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

4 个答案:

答案 0 :(得分:3)

(已转换的表单评论)

ISBN应该标准化为单独的表格。对于给定的书,你可能正在处理多个ISBN,无论是精装版还是软背投影和物理媒体盲文,还有音频书和电子书电子版。我们甚至没有考虑过这本书的翻译版本是否是一个单独的数字。

给定作者的书籍有多种方式可以发布,我认为你不应该限制一本书可以打印2到1本书的电子书。

然后可以毫无问题地执行唯一性。

答案 1 :(得分:3)

  

如果这本书被打印出来,如果它是电子版,则它有1亿欧元,它有另一种ISBN。

我怀疑这只是众多分类中的一种,例如精装本,平装本,有声读物,Kindle,CD,下载。还要考虑多个发布者,语言,区域设置等。使用ISBN的一个好处是您不必怀疑这些:您只需要知道该项目的ISBN号码,然后将其与其他项目的ISBN进行比较数字,以确定它们是否被认为是相同的。

答案 2 :(得分:2)

在同一个表上使用唯一索引和代理键是没有问题的。事实上,当使用代理键仍然声明“自然键”索引并使它们成为唯一时(或者它只是一个人工键,即它不是任何东西的替代品)是一个要求。

我当然会在ISBN上创建唯一索引来强制执行它们的唯一性,并让查询优化器知道列中的数据是唯一的。我们提交给查询优化器的信息越多,生成的计划就越有效。

答案 3 :(得分:1)

是的,每个表都应该有一个自然密钥(AKA“业务密钥”),无论它是否也有代理。使用唯一性约束来强制执行密钥。除了这些约束之外,正确使用索引是一个不同且基本无关的问题。

如果不分析业务需求,我无法说出ISBN是否是您桌子的正确商业密钥。可以说,应该有一些方法来识别您在业务领域内建模的实体。