資料庫主鍵的選取一直是一個讓人比較頭疼的問題. 園裡子裡面的討論也已經很多了.包括這篇小議資料庫主鍵選取策略(原創) 還有這篇資料庫主鍵設計之思考這兩篇都是比較優秀的文章, 基本上對幾種選取策取作了一些比較,在此基礎之上俺也有了一些粗淺的認識,相較之下,自訂的主鍵還是一個不錯的選擇,但是在產生方法上有一些考慮,如並發性問題,所以在”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