English 中文(简体)
当使用GUID作为主键时,不使用外键或未使用的外键。
原标题:
  • 时间:2009-03-07 20:28:04
  •  标签:

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

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

However, I m not sure how to handle cases where we want the foreign key to indicate none selected . For example, a client has a single admin user. This is set up as a foreign key (login_id) to login.id (a GUID). However, if a client doesn t yet have an admin user, how would we easily set up a "None Selected" key?

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

最佳回答

你有三个选项:

在您引用的表中,添加GUID为全零的空值行,然后链接到此记录。

2) 只需为空参考存储空值

3) Don t have the blank records in the reference table, but store an all zero guid. This may cause problems if joins are done in in the database, or with reports. You ll have to code for this special case.

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

问题回答

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

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

希望这能帮到你。

我可能在这里错过了一些非常显而易见的东西,但是你不能只把它设置为 NULL 吗?

使子表中的外键字段可以为空,并且在没有管理员用户时保持字段为空。像“0”标识列这样的神奇值是一场难以预料的灾难。





相关问题
热门标签