使用GUID作为主键时,“无”或“未使用”外键

时间:2009-03-07 20:28:04

标签: sql sql-server primary-key guid

我们正在构建一个可能需要复制到许多服务器的应用程序(我希望不会,但是在我们发布在线产品之前,无法知道客户端是否需要自己的客户端/服务器副本)。

由于服务器数量未知,我决定对任何事务表ID使用GUID。由于每个客户端都有自己的数据库,我打算使用NEWSEQUENTIALID()默认值,最大的表每年添加不超过1.5M行(但平均行数为15K),我不认为会出现太大的性能问题

但是,我不知道如何处理我们希望外键指示“未选择”的情况。例如,客户端只有一个管理员用户。这被设置为login.id(GUID)的外键(login_id)。但是,如果客户端还没有管理员用户,我们如何轻松设置“无选择”键?

在先前的应用程序中,我们使用了IDENTITY列,并在ID为0的大多数表中插入了一个虚拟条目。是否有一种可接受的方法来提供与GUID类似的功能?

4 个答案:

答案 0 :(得分:4)

唯一安全的方法是将FK值设置为NULL。如果需要在多个服务器之间复制数据,请确保您复制的每个表都有GUID作为主键,外键关系从来都不是问题。

复制可以通过这种方式非常简单地工作:首先以父表到子表的顺序复制插入和更新,之后将已删除的记录从子复制到父表。 (逆序。)

希望这会有所帮助。

答案 1 :(得分:2)

您有3个选项:

1)在您引用的表中,添加带有全零值guid的空白值行,然后链接到此记录

2)只为空白参考

存储空值

3)参考表中没有空白记录,但存储全零指南。如果在数据库中或使用报告进行连接,这可能会导致问题。你必须为这个特殊情况编码。

我会说1和2是唯一不错的选择。

答案 2 :(得分:1)

我可能会遗漏一些非常明显的东西,但是你不能把它设置为NULL吗?

答案 3 :(得分:1)

使子表中的外键字段为NULL,并在没有管理员用户时保持字段为NULL。像“0”标识列这样的神奇值是等待发生的灾难。