【发布时间】:2011-07-09 17:35:05
【问题描述】:
当我对外引用一个表时,声明该列是唯一的有什么意义吗?
我的意思当然是我引用的那一列是独一无二的。
【问题讨论】:
标签: mysql sql sql-server database performance
当我对外引用一个表时,声明该列是唯一的有什么意义吗?
我的意思当然是我引用的那一列是独一无二的。
【问题讨论】:
标签: mysql sql sql-server database performance
是的,想象一下以下场景:
表 1 的 id 字段是您的外键。这是一个唯一的索引。
Table 1:
________________________
| id | value | blah... |
|----|--------|---------|
| 0 | val 1 | .... |
|----|--------|---------|
| 1 | val 2 | .... |
|----|--------|---------|
... ... ...
现在表 2 有两种可能性。
1) table_1_id 不是唯一的
Table 2:
_____________________________
| id | table_1_id | blah... |
|----|-------------|---------|
| 0 | 1 | .... | <------ Duplicates are okay!
|----|-------------|---------| <--/
| 1 | 1 | .... |
|----|-------------|---------|
... ... ...
2) table_1_id 是唯一的
Table 2:
_____________________________
| id | table_1_id | blah... |
|----|-------------|---------|
| 0 | 1 | .... |
|----|-------------|---------|
| 1 | n | .... | <------- Cannot be 1, no duplicates
|----|-------------|---------|
... ... ...
【讨论】:
如果你希望它是唯一的,你就声明它是唯一的。
【讨论】:
多条记录可以引用另一个表中的单行,这是完全有效的数据库设计(1:M 关系)。所以问题是,第二个表中的字段是否应该是唯一的。从问题中并不清楚您的性能考虑是什么
【讨论】:
正如@yi_H 所说,创建唯一约束通常是为了执行管理数据的规则。然而,由于唯一约束等同于唯一索引,因此创建它们有一些优点和缺点。字段上的索引将需要更多时间来执行对该字段的插入或更新,因为需要检查索引是否重复和更新。索引也会增加表的大小。在专业方面,如果您根据该字段的值(即WHERE myUniqueField = 5 或JOIN myTable ON myUniqueField = someOtherIndexedField)执行查询,这些查询将运行得更快,因为它们可以执行索引查找而不是扫描。这些注意事项仅在您拥有大量数据或需要快速运行大量查询时才会发挥作用。所以一般来说,如果您有一个应该唯一的字段,请将其设置为唯一的。
【讨论】: