zoukankan      html  css  js  c++  java
  • 数据库生成唯一主键的方案列表

    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

     

     

    Top
    收藏
    关注
    评论
  • 相关阅读:
    1082 射击比赛 (20 分)
    1091 N-自守数 (15 分)
    1064 朋友数 (20 分)
    1031 查验身份证 (15 分)
    1028 人口普查 (20 分)
    1059 C语言竞赛 (20 分)
    1083 是否存在相等的差 (20 分)
    1077 互评成绩计算 (20 分)
    792. 高精度减法
    791. 高精度加法
  • 原文地址:https://www.cnblogs.com/liuyu7177/p/3263956.html
Copyright © 2011-2022 走看看