数据库主键的选取一直是一个让人比较头疼的问题. 园里子里面的讨论也已经很多了.包括这篇
小议数据库主键选取策略(原创) 还有这篇
数据库主键设计之思考这两篇都是比较优秀的文章, 基本上对几种选取策取作了一些比较,在此基础之上俺也有了一些粗浅的认识,相较之下,自定义的主键还是一个不错的选择,但是在生成方法上有一些考虑,如并发性问题,所以在”Max+1“和"自制加1"的方案中将相关编号存放于数据库中不是一样太好的方案, 结合这两种方案提供的思路于是乎俺就写了这样一个C#主键发生器:
1. 为了避免线程冲突而采用了单件模式来生成主键,并将上一个主键存放起来,以免生成重复的主键。
2. 字段类型采用定长字符型,如char(20), 生成的字符串前面还可以加上不同的前缀,比如表前缀或者其它一些有意义的标识符.
3. 转化成字母的十六进制类型是为了让最后的长度更小一些.
请大家参考:
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace GB.Core
6 {
7 /// <summary>
8 /// Powered By 沙加, matin0728@gmail.com, QQ5364241
9 /// </summary>
10 public class IdentityGenerator
11 {
12 static long lastIdentity = 0 ;
13 static IdentityGenerator o = new IdentityGenerator();
14 public static IdentityGenerator Instance
15 {
16 get
17 {
18 if (o != null )
19 return o;
20 else
21 return new IdentityGenerator();
22 }
23 }
24 public string NextIdentity()
25 {
26 long idint = DateTime.Now.Ticks - new DateTime( 2000 , 11 , 1 ).Ticks;
27
28 while (lastIdentity >= idint)
29 {
30 idint ++ ;
31 }
32 lastIdentity = idint;
33
34 return Convert.ToString(idint, 16 );
35 }
36 }
37 }
38
1. 为了避免线程冲突而采用了单件模式来生成主键,并将上一个主键存放起来,以免生成重复的主键。
2. 字段类型采用定长字符型,如char(20), 生成的字符串前面还可以加上不同的前缀,比如表前缀或者其它一些有意义的标识符.
3. 转化成字母的十六进制类型是为了让最后的长度更小一些.
请大家参考:
1 using System;
2 using System.Collections.Generic;
3 using System.Text;
4
5 namespace GB.Core
6 {
7 /// <summary>
8 /// Powered By 沙加, matin0728@gmail.com, QQ5364241
9 /// </summary>
10 public class IdentityGenerator
11 {
12 static long lastIdentity = 0 ;
13 static IdentityGenerator o = new IdentityGenerator();
14 public static IdentityGenerator Instance
15 {
16 get
17 {
18 if (o != null )
19 return o;
20 else
21 return new IdentityGenerator();
22 }
23 }
24 public string NextIdentity()
25 {
26 long idint = DateTime.Now.Ticks - new DateTime( 2000 , 11 , 1 ).Ticks;
27
28 while (lastIdentity >= idint)
29 {
30 idint ++ ;
31 }
32 lastIdentity = idint;
33
34 return Convert.ToString(idint, 16 );
35 }
36 }
37 }
38