当前位置:Gxlcms > 数据库问题 > 数据库设计中主键问题

数据库设计中主键问题

时间:2021-07-01 10:21:17 帮助过:2人阅读

代码如下:
//================================================ 
/**////<summary> 
/// 返回 GUID 用于数据库操作,特定的时间代码可以提高检索效率 
/// </summary> 
/// <returns>COMB (GUID 与时间混合型) 类型 GUID 数据</returns> 
public static Guid NewComb() 

byte[] guidArray = System.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 = new TimeSpan(now.Ticks - (new DateTime(now.Year, now.Month, now.Day).Ticks));
// 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 System.Guid(guidArray); 

//================================================ 
/**//// <summary> 
/// 从 SQL SERVER 返回的 GUID 中生成时间信息 
/// </summary> 
/// <param name="guid">包含时间信息的 COMB </param> 
/// <returns>时间</returns> 
public static DateTime GetDateFromComb(System.Guid guid) 

DateTime baseDate = new DateTime(1900,1,1); 
byte[] daysArray = new byte[4]; 
byte[] msecsArray = new byte[4]; 
byte[] guidArray = guid.ToByteArray(); 
// Copy the date parts of the guid to the respective byte arrays. 
Array.Copy(guidArray, guidArray.Length - 6, daysArray, 2, 2); 
Array.Copy(guidArray, guidArray.Length - 4, msecsArray, 0, 4); 
// Reverse the arrays to put them into the appropriate order 
Array.Reverse(daysArray); 
Array.Reverse(msecsArray); 
// Convert the bytes to ints 
int days = BitConverter.ToInt32(daysArray, 0); 
int msecs = BitConverter.ToInt32(msecsArray, 0); 
DateTime date = baseDate.AddDays(days); 
date = date.AddMilliseconds(msecs * 3.333333); 
return date; 

 

综上述六种主键选取策略,笔者认为使用“COMB(Combine)”类型做主键是比较恰当的主键应用策略,但在实际使用过程中要根据客观实践、因时因事选取适当的主键,切不可生搬硬套、弄巧成拙。

参考文献:

1、《系统分析师教程》 张友生 主编
2、《中文版SQL Server 2000开发与管理应用实例》 邹建 主编
3、《数据库中使用自增量字段与Guid字段主键的性能对比》作者 不详
4、《小议数据库主键选取策略》 作者 不详

数据库设计中主键问题

标签:

人气教程排行