1

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

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

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

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

4

4 回答 4

4

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

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

希望这可以帮助。

于 2009-03-07T23:17:58.887 回答
2

您有 3 个选项:

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

2)只为空白引用存储一个空值

3)参考表中没有空白记录,但存储一个全零的guid。如果在数据库或报表中进行连接,这可能会导致问题。您必须为这种特殊情况编写代码。

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

于 2009-03-07T20:40:14.083 回答
1

我可能在这里遗漏了一些非常明显的东西,但是您不能将其设置为 NULL 吗?

于 2009-03-07T20:33:13.447 回答
1

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

于 2009-03-07T20:33:33.023 回答