2015-04-02 44 views
1

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

当公开数据发布时,数据库会定期更新,每月一次,每年一次,并且查询负载较低。

我有一些表中列的组合使每一行都是唯一的。我知道我可以使用复合主键,但我不确定这是否是最佳实践,因为我阅读的许多文章都有相互冲突的观点。

例如,一个表需要的唯一性五列与数据类型:

  • SMALLINT
  • 炭(7)
  • VARCHAR(7)
  • SMALLINT
  • VARCHAR(3)

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

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

  1. 什么是最好的选择,如果是使用复合主键应该是聚簇还是非聚簇?
  2. 是否有一个建议的组合主键的最大列数和字节数?
+1

由于没有外键引用此表,没有下降到复合群集主键。您只需根据查询表的方式决定哪个列应该是最前面的列,然后为用户可能经常搜索的其他列(键或不键)添加非聚簇索引。 – 2015-04-02 11:58:48

+0

我认为领先专栏应该是最常用于查询的专栏?其他栏的顺序是否有相关性? – Kieran 2015-04-02 13:03:17

+0

是的,领先列取决于查询表的方式。例如,如果外键列通常作为一对多标识关系的多边访问,那么将外键列指定为主键中的第一个键是有意义的。 – 2015-04-03 02:31:07

回答

-1

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

然后如果你想仅仅是在同一个表中的列的独特组合的河畔,简单的方法是用一个指标是关键字UNIQUE:

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

我可以添加一个ID列,但如果可能的话,我宁愿使用复合主键,因为这与数据有关。 – Kieran 2015-04-02 13:05:52

+0

@Kieran当然你可以保留你的复合键。那么独特的索引呢?解决你的问题? – Julian50 2015-04-02 13:26:09

+0

这里的ID列没有任何用处。五列上的唯一*约束*不是可选的 - 确保数据完整性至关重要。只有ID号码不会防止这五列中的重复。 – 2015-04-02 13:32:35