标签:
在建立数据库的时候,需要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引。因为主键可以唯一标识某一行记录,所以可以确保执行数据更新、删除的时候不会出现张冠李戴的错误。数据库的主键生成有多种方式,每种方式都有其优点和缺点,应该根据不同的需求在主键的时间和空间效率上做平衡折中,从而选择不同的主键生成策略。归纳起来,对主键的选择主要有以下四种方式:
下表列出四种主键生成方式优缺点的比较:
| 
 主键生成策略  | 
 优点  | 
 缺点  | 
| 
 自动增长字段  | 
  | 
  | 
| 
 手动增长型字段  | 
  | 
  | 
| 
 使用GUID  | 
  | 
  | 
| 
 使用“COMB”类型  | 
  | 
  | 
COMB类型主键生成实现:
COMB数据类型的基本设计思路是这样的:既然GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么能不能通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与GUID组合起来,在保留GUID的唯一性的同时增加了有序性,以此来提高索引效率。
在NHibernate中,COMB型主键的生成代码如下所示:
public Guid GenerateComb()
{
    byte[] guidArray = Guid.NewGuid().ToByteArray();
    DateTime baseDate = new DateTime(1900, 1, 1);
    DateTime now = DateTime.Now;
    // Get the days and milliseconds which will be used to build 
    //the byte string 
    TimeSpan days = new TimeSpan(now.Ticks - baseDate.Ticks);
    TimeSpan msecs = now.TimeOfDay;
    // Convert to a byte array   
    // Note that SQL Server is accurate to 1/300th of a 
    // millisecond so we divide by 3.333333 
    byte[] daysArray = BitConverter.GetBytes(days.Days);
    byte[] msecsArray = BitConverter.GetBytes((long)(msecs.TotalMilliseconds / 3.333333));
    // Reverse the bytes to match SQL Servers ordering 
    Array.Reverse(daysArray);
    Array.Reverse(msecsArray);
    // Copy the bytes into the guid 
    Array.Copy(daysArray, daysArray.Length - 2, guidArray,guidArray.Length - 6, 2);
    Array.Copy(msecsArray, msecsArray.Length - 4, guidArray,guidArray.Length - 4, 4);
    return new Guid(guidArray);
}
标签:
原文地址:http://www.cnblogs.com/wolfocme110/p/5596166.html