【问题标题】:Database design: primary keys and unique constraints数据库设计:主键和唯一约束
【发布时间】:2015-04-02 10:19:19
【问题描述】:

我正在构建我的第三个数据库,但我不确定如何构建主键和唯一约束以确保数据完整性。

当公开数据发布时,数据库会定期更新,有些是每月更新,有些是每年更新,查询负载会很低。

我有一些表格,其中的列组合使每一行都独一无二。我知道我可以使用复合主键,但我不确定这是否是最佳实践,因为我阅读的许多关于此的文章都有相互矛盾的观点。

例如,一张表需要五列来保证数据类型的唯一性:

  • smallint
  • 字符(7)
  • varchar(7)
  • smallint
  • varchar(3)

我相信这将使主键最多 25 个字节,并且所有这五列都将被定期选择并经常在 where 子句中使用。其中一个 smallints 也是外键,但没有外键会引用此表。

我知道的唯一替代方法是为每一行创建一个唯一标识符,将其设置为主键并在五列上创建一个唯一约束。

  1. 最好的选择是什么?如果要使用复合主键,应该是集群还是非集群?
  2. 复合主键是否有建议的最大列数和字节数?

【问题讨论】:

  • 由于没有外键引用此表,复合聚簇主键没有缺点。您只需要根据查询表的方式决定哪一列应该是前导列,然后为剩余的用户可能经常搜索的列添加非聚集索引(键与否)。
  • 我认为前导列应该是查询中最常用的列?其他列的顺序有关系吗?
  • 是的,前导列取决于表的查询方式。例如,如果外键列是作为一对多标识关系的多方通常访问的,则将外键列指定为主键中的第一个是有意义的。

标签: sql-server database tsql


【解决方案1】:

我不知道你的数据库的目的是什么,但首先建议你是否可以添加 ,id 列作为主键。每次查询都会更容易。

那么如果你只想在同一个表中获得唯一的列组合,简单的方法是使用关键字 UNIQUE 的索引:

CREATE UNIQUE NONCLUSTERED INDEX [IX_COLUMN1_COLUMN2]
ON TABLE(COLUMN1 ASC, COLUMN2ASC);

【讨论】:

  • 我可以添加一个 ID 列,但如果可能,我更愿意使用复合主键,因为这与数据相关。
  • @Kieran 当然你可以保留你的复合键。那么唯一索引呢?解决你的问题了吗?
  • ID 列在这里没有用处。五列上的唯一约束不是可选的——它对保证数据完整性至关重要。单独的 ID 号并不能防止这五列中的重复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
相关资源
最近更新 更多