SQL Server将外键引用到非主键列

时间:2013-05-21 08:38:27

标签: sql-server database

最近我们遇到了以下情况:

我们正在设计一个数据库并预测数据将在6个月内显着增长到数百万条记录。我们希望每行都有一个Guid作为唯一ID,这允许我们稍后将数据移动到OLAP / Archive数据库,在Identity和Guid密钥的许多参数之后,我们想出了Guid作为唯一ID。但是,Guid作为主键总是一个坏主意,因此我们将表的主键设置为Identity列。设计如下所示

用户

| Id (PK, Identity)                                                 |
| UserId (Guid, Unique-constraint, non-clustered index)             |  
| Name                                                              |
| Email                                                             |
| ...                                                               |

备注

| Id (PK, Identity)                                                 |
| NoteId (Guid, Unique-constraint, non-clustered index)             |
| UserId (Guid, Foreign Key to Users(UserId)                        |
| Title                                                             |
| Text                                                              |
| ...                                                               |

将数据移动到存档时,我们不再需要关心身份密钥了。

这个设计有什么问题吗?表现怎么样?请给我建议,谢谢。

1 个答案:

答案 0 :(得分:1)

即使你没有GUID作为主键,你仍然会将它用于连接,为服务器做更多的工作。

您是否有理由不使用Users.Id作为FK目标?

UserId (INT, Foreign Key to Users(Id)

请记住,你也想要对上面的列进行索引,所以你的方式仍然会在表上最终得到两个GUID索引,因为我打赌程序员在应用程序层中制作随机GUID,这可能是碎片化的,你不是在DB中创建NEWSEQUENTIALID()吗?