Database design 数据库设计组合键

Database design 数据库设计组合键,database-design,foreign-keys,primary-key,Database Design,Foreign Keys,Primary Key,我将使用一个人为的例子:一个总部有一个或多个联系人。联系人只能属于一个总部 TableName=总部 列0=Id:Guid[PK] 第1列=名称:nvarchar(100) 第2列=IsAnotherAttribute:bool TableName=联系人信息 列0=Id:Guid[PK] 第1列=总部ID:Guid[FK] 第2列=地址行1 第3列=地址行2 第4列=地址行3 我想在这里获得一些设置表主键和外键的帮助? 上述情况如何? 我是否应该对[第0列和第1列]上的联系人信息使用复

我将使用一个人为的例子:一个总部有一个或多个联系人。联系人只能属于一个总部


TableName=总部

列0=Id:Guid[PK]
第1列=名称:nvarchar(100)
第2列=IsAnotherAttribute:bool



TableName=联系人信息

列0=Id:Guid[PK]
第1列=总部ID:Guid[FK]
第2列=地址行1
第3列=地址行2
第4列=地址行3


我想在这里获得一些设置表主键和外键的帮助?
上述情况如何?
我是否应该对[第0列和第1列]上的联系人信息使用复合键?

始终使用代理密钥可以吗

我会远离复合键。代理键的问题有待讨论,但如果我可以解决的话,我总是使用INT-Identity列(在SQLServer中)。只有当数据库必须支持复制或合并分布式数据时,我才使用guid


我认为除了guid之外,您的列看起来还不错。

我会远离复合键。代理键的问题有待讨论,但如果我可以解决的话,我总是使用INT-Identity列(在SQLServer中)。只有当数据库必须支持复制或合并分布式数据时,我才使用guid


我认为除了guid之外,您的列看起来还不错。

我认为您的主键应该是
Id
。如果您经常同时使用这两条信息,
Id
HeadquarterID
ContactInformation
上的复合键可能有意义,但是我更喜欢只使用
Id
作为一个键,然后你可以在
Id
总部Id
上创建一个索引,如果你真的需要的话。

我想说你的主键应该是
Id
。如果您经常同时使用这两条信息,
Id
HeadquarterID
ContactInformation
上的复合键可能有意义,但我更喜欢只使用
Id
作为键,然后您可以在
Id
HeadquarterID
上创建索引,如果您确实需要的话。

如果每个联系人可以属于多个总部,您只需要在ContactInformation的第0列和第1列上创建一个复合键;既然你需要相反的东西,你所描述的应该很好


就我个人而言,我只会在真正需要的时候使用guid。否则,请坚持使用ints。我也倾向于在几乎所有地方使用代理键。

如果每个联系人可能属于多个总部,则只需要在ContactInformation的第0列和第1列上使用复合键;既然你需要相反的东西,你所描述的应该很好


就我个人而言,我只会在真正需要的时候使用guid。否则,请坚持使用ints。我也倾向于在几乎所有地方使用代理密钥。

以及代理密钥(您的GUID Id)通常最好根据定义实体的业务属性来标识业务密钥(自然密钥/域密钥)

在目前的表格设计中,添加两个具有相同属性(姓名、总部、地址等)的联系人是没有任何阻碍的。这通常是不可取的,因此在定义接触的属性上添加复合自然关键点。由于PK已经定义,非自然键将是这些属性上的唯一约束/索引


我同意PK应该是简单的,而不是复合的。复合PK是一个真正的难题,查询变得更加复杂。

以及代理密钥(您的GUID Id)通常最好根据定义实体的业务属性识别业务密钥(自然密钥/域密钥)

在目前的表格设计中,添加两个具有相同属性(姓名、总部、地址等)的联系人是没有任何阻碍的。这通常是不可取的,因此在定义接触的属性上添加复合自然关键点。由于PK已经定义,非自然键将是这些属性上的唯一约束/索引


我同意PK应该是简单的,而不是复合的。组合PK是一个真正的难题,查询变得更加复杂。

如果认为这是使用组合键还是代理的选择,那就错了。代理键实现了与其他属性上的键约束完全不同的功能。代理项不会阻止那些attibute值被复制,因此如果您只使用一个键或另一个键,则表的含义将完全不同

您应该实现确保数据唯一性和完整性所需的任何键。如果这意味着使用复合键和代理,那么就这样做


话虽如此,我不清楚您的示例中可能的关键点是什么。如果Id是ContactInformation的候选键,那么(HeadquarterId,Id)不是-它是一个超级键,但它不是不可还原的。

如果认为这是使用复合键或代理键之间的选择,那就错了。代理键实现了与其他属性上的键约束完全不同的功能。代理项不会阻止那些attibute值被复制,因此如果您只使用一个键或另一个键,则表的含义将完全不同

您应该实现确保数据唯一性和完整性所需的任何键。如果这意味着使用复合键和代理,那么就这样做

话虽如此,我不清楚您的示例中可能的关键点是什么。如果Id是ContactInformation的候选键,那么(HeadquarterId,Id)不是-它是一个超级键,但不是不可还原的