数据库生成唯一主键的方案列表

1、  使用数据库自增Id。

2、  单独开一个数据库,获取全局唯一的自增序列号或各表的MaxId。

   1)         使用自增序列号表。

   2)         使用MaxId表存储各表的MaxId值。

   3)         新方案: 整体思想:建立两台以上的数据库ID生成服务器,每个服务器都有一张记录各表当前ID的MaxId表,但是MaxId表中Id的增长步长是服务器的数量,起始值依次错开,这样相当于把ID的生成散列到每个服务器节点上。例如:如果我们设置两台数据库ID生成服务器,那么就让一台的MaxId表的Id起始值为1(或当前最大Id+1),每次增长步长为2,另一台的MaxId表的ID起始值为2(或当前最大Id+2),每次步长也为2。这样就将产生ID的压力均匀分散到两台服务器上,同时配合应用程序控制,当一个服务器失效后,系统能自动切换到另一个服务器上获取ID,从而解决的单点问题保证了系统的容错。(Flickr思想)。

3、  Sequence特性。

  1)        这个特性在SQL Server 2012、Oracle中可用。这个特性是数据库级别的,允许在多个表之间共享序列号。它可以解决分表在同一个数据库的情况,但倘若分表放在不同数据库,那将共享不到此序列号。(eg:Sequence使用场景:你需要在多个表之间公用一个流水号。以往的做法是额外建立一个表,然后存储流水号)。

4、  通过数据库集群编号+集群内的自增类型两个字段共同组成唯一主键。

5、  通过设置每个集群中自增 ID 起始点(auto_increment_offset),将各个集群的ID进行绝对的分段来实现全局唯一。当遇到某个集群数据增长过快后,通过命令调整下一个 ID 起始位置跳过可能存在的冲突。

6、  GUID。

优点:GUID是最简单的方案,全局唯一的Id,数据间同步、迁移都能简单实现。

7、  GUID TO Int64。

即将GUID转为了19位数字,数字反馈给客户可以一定程度上缓解友好性问题。

8、  自己写编码规则。

9、 Random生成高唯一性随机码。

  1. 使用Environment.TickCount做为Random参数(即Random的默认参数),重复性最大。
  2. 使用DateTime.Now.Ticks做为Random参数,存在重复。
  3. 使用unchecked((int)DateTime.Now.Ticks)做为Random参数,存在重复。
  4. 使用Guid.NewGuid().GetHashCode()做为random参数,测试不存在重复(或存在性极小)。
  5. 使用RNGCryptoServiceProvider做为random参数,测试不存在重复(或存在性极小)。
  6.   代码事例:static int GetRandomSeed()

            {

                byte[] bytes = new byte[4];

                System.Security.Cryptography.RNGCryptoServiceProvider rng

    = new System.Security.Cryptography.RNGCryptoServiceProvider();

                rng.GetBytes(bytes);

                return BitConverter.ToInt32(bytes, 0);

            }

注:这个只是方案列表,方案来源http://www.cnblogs.com/heyuquan/p/global-guid-identity-maxId.html。

 

 

 

转载于:https://www.cnblogs.com/liuyu7177/p/3263956.html

你可能感兴趣的:(数据库生成唯一主键的方案列表)