Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQl设计问题。唯一索引/约束与代理键_Sql - Fatal编程技术网

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

SQl设计问题。唯一索引/约束与代理键,sql,Sql,出于各种原因,我决定使用代理密钥(以种子身份的形式)。我的问题来自强制执行数据唯一性。例如,假设我正在创建一个数据库来存储图书馆中的所有书籍 isbn是一个唯一的标识符,分配给来自图书出版界某个神奇来源的所有图书。如果这本书是印刷的,它有一个isbn;如果它是电子的,它有另一个isbn 如果不在printedISBN和electronicsisbn列上放置一个唯一索引,我们就无法强制ISBN唯一性。我的具体问题是,我们有这种类型的场景,我们需要强制执行数据的唯一性,但我们使用的是代理主键,强制执

出于各种原因,我决定使用代理密钥(以种子身份的形式)。我的问题来自强制执行数据唯一性。例如,假设我正在创建一个数据库来存储图书馆中的所有书籍

isbn是一个唯一的标识符,分配给来自图书出版界某个神奇来源的所有图书。如果这本书是印刷的,它有一个isbn;如果它是电子的,它有另一个isbn

如果不在printedISBN和electronicsisbn列上放置一个唯一索引,我们就无法强制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上创建唯一的索引,以增强它们的唯一性,并让查询优化器知道列中的数据是唯一的。我们向查询优化器提供的信息越多,生成的计划执行得就越好。

在同一个表上具有唯一索引和代理键是没有问题的。事实上,当使用代理键时,仍然需要声明“自然键”索引并使其唯一(否则它只是一个人工键,即它不是任何东西的代理)

我当然会在ISBN上创建唯一的索引,以增强它们的唯一性,并让查询优化器知道列中的数据是唯一的。我们向查询优化器提供的信息越多,生成的计划执行得越好。

(转换后的表单注释)

ISBN应标准化为单独的表格。对于一本给定的书,你可能要处理多个ISBN,无论是精装书、软装书、盲文版还是有声书和电子书电子版。我们甚至没有考虑过这本书的翻译版本是否是一个单独的数字

一本书可以通过多种方式发布,我认为你不应该限制ISBN的一本书只能有2-1个印刷版,1个电子版

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

(转换后的表单注释)

ISBN应标准化为单独的表格。对于一本给定的书,你可能要处理多个ISBN,无论是精装书、软装书、盲文版还是有声书和电子书电子版。我们甚至没有考虑过这本书的翻译版本是否是一个单独的数字

一本书可以通过多种方式发布,我认为你不应该限制ISBN的一本书只能有2-1个印刷版,1个电子版

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

如果这本书是印刷的,它有一个isbn;如果它是电子的,它有另一个isbn

我怀疑这只是众多分类中的一种,例如精装本、平装本、有声读物、Kindle、CD、下载。也可以考虑使用多个发布者、语言、语言环境等。使用ISBN的一个重要的方面是,你不必怀疑其中的任何一个:你只需要知道这个项目的ISBN号,然后将它与另一个项目的ISBN号进行比较,以找出它们是否被认为是相同的。 如果这本书是印刷的,它有一个isbn;如果它是电子的,它有另一个isbn


我怀疑这只是众多分类中的一种,例如精装本、平装本、有声读物、Kindle、CD、下载。也可以考虑多个出版商、语言、语言环境等。使用ISBN的一个重要的方面是,你不必怀疑这些:你只需要知道这个项目的ISBN号,然后将它与另一个项目的ISBN号进行比较,看看它们是否被认为是相同的。

< P>每个表都应该有一个自然键(也称为“业务键”),不管它是否也有代理项。使用唯一性约束强制关键点。除了这些约束之外,索引的正确使用是一个不同的、本质上不相关的问题


如果不分析业务需求,我就无法确定ISBN是否是您表的正确业务键。只需说,应该有某种方法来识别您在业务领域中建模的实体。

是的,每个表都应该有一个自然键(也称为“业务键”),不管它是否也有代理项。使用唯一性约束强制关键点。除了这些约束之外,索引的正确使用是一个不同的、本质上不相关的问题


如果不分析业务需求,我就无法确定ISBN是否是您表的正确业务键。只需说,应该有某种方法来识别您在业务领域中建模的实体。

一个可能的答案是,您将ISBN详细信息规范化为另一个表、BookID、ISBN、ISBNType、OtherMeta字段,然后在ISBN上设置唯一约束就很简单了。将主键设为isbn,将列设为isbn类型,然后将另一个表设为typeID,isbn类型。这将允许我将任何类型的guid放入其中,只要我将其与以下类型相关联