我们正在构建一个可能需要复制到许多服务器的应用程序(我希望不会,但是在我们发布在线产品之前,无法知道客户端是否需要自己的客户端/服务器副本)。
由于服务器数量未知,我决定对任何事务表ID使用GUID。由于每个客户端都有自己的数据库,我打算使用NEWSEQUENTIALID()默认值,最大的表每年添加不超过1.5M行(但平均行数为15K),我不认为会出现太大的性能问题
但是,我不知道如何处理我们希望外键指示“未选择”的情况。例如,客户端只有一个管理员用户。这被设置为login.id(GUID)的外键(login_id)。但是,如果客户端还没有管理员用户,我们如何轻松设置“无选择”键?
在先前的应用程序中,我们使用了IDENTITY列,并在ID为0的大多数表中插入了一个虚拟条目。是否有一种可接受的方法来提供与GUID类似的功能?
答案 0 :(得分:4)
唯一安全的方法是将FK值设置为NULL。如果需要在多个服务器之间复制数据,请确保您复制的每个表都有GUID作为主键,外键关系从来都不是问题。
复制可以通过这种方式非常简单地工作:首先以父表到子表的顺序复制插入和更新,之后将已删除的记录从子复制到父表。 (逆序。)
希望这会有所帮助。
答案 1 :(得分:2)
您有3个选项:
1)在您引用的表中,添加带有全零值guid的空白值行,然后链接到此记录
2)只为空白参考
存储空值3)参考表中没有空白记录,但存储全零指南。如果在数据库中或使用报告进行连接,这可能会导致问题。你必须为这个特殊情况编码。
我会说1和2是唯一不错的选择。
答案 2 :(得分:1)
我可能会遗漏一些非常明显的东西,但是你不能把它设置为NULL吗?
答案 3 :(得分:1)
使子表中的外键字段为NULL,并在没有管理员用户时保持字段为NULL。像“0”标识列这样的神奇值是等待发生的灾难。