Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用自定义编码方案而不是GUID作为主键_Sql_Sql Server_Ms Access_Database Design - Fatal编程技术网

Sql 使用自定义编码方案而不是GUID作为主键

Sql 使用自定义编码方案而不是GUID作为主键,sql,sql-server,ms-access,database-design,Sql,Sql Server,Ms Access,Database Design,我正在将后端MS Access数据库升级到SQL Server。前端客户端目前仍将是一个访问应用程序(大约有3万行代码) 其目的是最终允许跨多台服务器同步数据库访问(不使用复制,但可能使用同步框架)。 当前,Access表中的所有主键都是自动递增整数代理 我不是问升迁的过程,而是问我是否应该为PK使用GUID或其他编码(我知道我可以将数字范围拆分为多个服务器,但我不想这样做,如果需要,允许在客户端上创建PK,例如在脱机模式下) GUID 赞成者: 标准化格式 确保唯一性(实际上无论如何) 缺

我正在将后端MS Access数据库升级到SQL Server。前端客户端目前仍将是一个访问应用程序(大约有3万行代码)

其目的是最终允许跨多台服务器同步数据库访问(不使用复制,但可能使用同步框架)。
当前,Access表中的所有主键都是自动递增整数代理

我不是问升迁的过程,而是问我是否应该为PK使用GUID或其他编码(我知道我可以将数字范围拆分为多个服务器,但我不想这样做,如果需要,允许在客户端上创建PK,例如在脱机模式下)

GUID

赞成者:

  • 标准化格式
  • 确保唯一性(实际上无论如何)
缺点:

  • 在Access中不容易操作,尤其是在将它们用作子窗体或控件的筛选器时
  • 由于插入的随机性,会降低插入性能
  • 具有多个表示形式:需要转换的字符串、规范格式和二进制
自定义编目方案

我认为,使用更统一的代码作为PK的方案可能会避免性能损失,而且最重要的是,确保PK在必要时在表单控件中仍然可用(并且不需要这些与字符串的转换)

我对编目方案的想法是将10个字符的代码分为:

  • 8位表示时间戳
  • 4位数字表示唯一的客户端ID
  • 2位数字作为潜在合并的随机数 每个数字都以34为底,由A-Z和2-9的字母组成,避免了
    O
    0
    1
    I
    ,因为它们相似(如果我们需要手动处理这些PK,例如在调试期间)
赞成者:

  • 案件发生时更易于手动处理
  • 不需要在不同的表示形式之间进行转换,因为它基本上是一个字符串(因此要适应的现有代码较少)
  • 唯一性保证(实际)
缺点:

  • JOIN中的性能尚未得到验证
  • INSERT中的性能应快于GUID,但未经验证
  • 每个服务器/客户机都必须设置自己的UID,尽管这不应该是一个太大的问题

那么,我应该为我的PK使用GUID还是其他方案?

您计划使用多少条记录?bigint不够大吗?最多9223372036854775807条记录

如果它只用于插入,而对数据没有选择,那么选择what-ever方案(我仍然会说bigint或GUID/uniqueidentifier)。如果需要进行选择,int或bigint比GUID或任何其他自定义PK快得多

在Access中不易操作,尤其是在将它们用作子窗体或控件的筛选器时。

->Access的GUID为Number->Replication Identificator。我们在Access中有应用程序,每个PK都作为GUID,我们对过滤器(以及子ROM的过滤器)没有任何问题

由于插入的随机性,会降低插入性能。

->如果基于此存在性能问题,则可以在另一列上设置集群索引(例如时间戳)。但是MSSQL服务器有两个生成新GUID值的函数——“newid()”和“newsequenceid()”。第二个方法——正如名字所说——按顺序生成新值,因此插入性能问题不应该发生

有多个表示形式:需要转换的字符串、规范格式和二进制。

->在我看来,它是“专业的:)。但对于用户来说,开发人员和用户管理员处于访问状态,MSSQL以字符串的形式表示和使用

GUID位于核心“仅”128位数字中。我认为您不应该担心GUID列上联接的有效性。例如,连接GUID列比文本列上的条件更有效


我不认为自定义编目方案是个好主意,因为您必须解决许多问题。另一方面,GUID是标准使用的,工具已经准备好使用它。

自动增量的问题是,如果您希望应用程序脱机工作或跨多个服务器访问,则很难管理自动增量。你需要分配范围,而这不是我想要管理的,它可能会变得毛茸茸的。我倾向于同意TcKs的答案,但在我看来,insert的理论性能问题不如使用标准内置数据类型的优点重要,它比任何自定义方案都更易于使用和维护。不使用guid作为您的主密钥,或者更确切地说,您的集群密钥是邪恶的!它们不仅在INSERT上给您带来了性能上的冲击,而且还使您的表大量碎片化——您的所有性能都将受到影响。请查看Kimberly Tripp关于永无休止的群集键辩论的优秀文章,该文章也位于,Access不承认BIGINT。您必须采取变通办法,使BIGINT PK的结果可编辑。如何从Access应用程序中创建顺序GUID?我还需要在客户端上保留此功能,以便在脱机模式下,客户端可以断开与SQL server的连接。连接后,可以从mssql上的access调用“newsequenceid()”。但是,当您断开连接时,“newsequenceid()”函数不可用。但我真的认为,未排序的ID不是问题。多年来,我们一直使用guid作为PK,并且没有任何性能问题。guid对于集群索引(默认情况下主键是主键)来说是不好的。它们会导致大规模的碎片化,并损害周围的性能。另外,由于集群密钥包含在每个非集群密钥中,因此它们的大小(16字节,INT为4字节)是一个问题!Access中GUID的问题有: