我正在将后端的 MS Access 数据库升级到 SQL Server。前端客户端暂时仍将保持为 Access 应用程序(有约 30k 行代码)。
目标是最终允许在多个服务器之间同步数据库(不使用复制,而可能使用同步框架)。 目前,Access 表中的所有主键都是自动递增整数代理。
我不是在询问升级过程,而是关于是否应该使用 GUID 或其他编码作为 PK(我知道可以在服务器之间分割数字范围,但我不想这样做,并且允许在必要时在客户端创建 PK,例如在离线模式下)。
GUID
优点: - 格式标准化。 - 确保唯一性(实际上是这样)。
缺点: - 在 Access 中不易操作,特别是当它们作为子窗体或控件的过滤器时。 - 由于随机性能降低插入性能。 - 具有多个表示形式:字符串、规范形式、二进制需要进行转换。
自定义编码方案
我认为使用更统一的代码作为 PK 的方案可能避免了性能惩罚,并且最重要的是确保 PK 在必要时仍可在表单控件中使用(并且不需要这些字符串之间的转换)。
我的编码方案的想法是一个由 10 个字符组成的代码,分为: - 8 位数字时间戳 - 4 位独特的客户端 ID - 2 位作为潜在冲突的随机数
每个数字都是基于 34 的,由 A-Z 和 2-9 的字母组成,避免了 O、0、1、I 的相似之处(以防需要手动处理这些 PK,例如在调试期间)。
优点: - 当必要时更容易手动处理。 - 不需要在不同表示之间进行转换,因为它基本上是一个字符串(因此需要适应的现有代码较少)。 - 确保唯一性(实际上)。
缺点: - JOIN 中的性能尚未得到证明。 - INSERT 中的性能应该比 GUID 更快,但尚未得到证明。 - 每个服务器/客户机必须设置自己的 UID,尽管这不应该是太大的问题。
所以,我应该使用 GUID 还是另一种方案作为我的 PK?
目标是最终允许在多个服务器之间同步数据库(不使用复制,而可能使用同步框架)。 目前,Access 表中的所有主键都是自动递增整数代理。
我不是在询问升级过程,而是关于是否应该使用 GUID 或其他编码作为 PK(我知道可以在服务器之间分割数字范围,但我不想这样做,并且允许在必要时在客户端创建 PK,例如在离线模式下)。
GUID
优点: - 格式标准化。 - 确保唯一性(实际上是这样)。
缺点: - 在 Access 中不易操作,特别是当它们作为子窗体或控件的过滤器时。 - 由于随机性能降低插入性能。 - 具有多个表示形式:字符串、规范形式、二进制需要进行转换。
自定义编码方案
我认为使用更统一的代码作为 PK 的方案可能避免了性能惩罚,并且最重要的是确保 PK 在必要时仍可在表单控件中使用(并且不需要这些字符串之间的转换)。
我的编码方案的想法是一个由 10 个字符组成的代码,分为: - 8 位数字时间戳 - 4 位独特的客户端 ID - 2 位作为潜在冲突的随机数
每个数字都是基于 34 的,由 A-Z 和 2-9 的字母组成,避免了 O、0、1、I 的相似之处(以防需要手动处理这些 PK,例如在调试期间)。
优点: - 当必要时更容易手动处理。 - 不需要在不同表示之间进行转换,因为它基本上是一个字符串(因此需要适应的现有代码较少)。 - 确保唯一性(实际上)。
缺点: - JOIN 中的性能尚未得到证明。 - INSERT 中的性能应该比 GUID 更快,但尚未得到证明。 - 每个服务器/客户机必须设置自己的 UID,尽管这不应该是太大的问题。
所以,我应该使用 GUID 还是另一种方案作为我的 PK?