第一次鼓起勇氣發首頁,大家有想法的,多留言,寫得不好,歡迎批評交流。堅持實實在在如銅牆鐵壁。
開發軟體項目,其實跟蓋房子原理很接近,需要很多元件來拼裝,例如都需要磚頭,序列生成器,其實也
是開發軟體過程中的重要磚頭之一,是軟體項目的最基礎的元件之一。
開發軟體時經常需要要産生唯一的不重複的ID代碼,還有有序增加的序列号、編号等,在單機使用時,問題
不嚴重,不容易暴露出來元件的錯誤,但是在多使用者并發時運作時或分布式運作環境下,元件的有很多缺陷
都會暴露出來的。
采用Guid方式生成主鍵是很不錯注意,但是有一個缺點,主鍵太長了,誰都不希望用這麼老長的字元串做為
主鍵,總覺得會影響軟體系統運作速度,大多數人也可能說,喜歡用自增量,SqlServer裡自增量是比較好用,
但是Oracle裡沒有這個屬性,用序列來實作,我們辛苦寫出來的一大堆程式,隻能在sqlserver上跑,那就不太
完美了,不太可能寫兩套程式,一套是sqlserver的,一套是Oracle的,若發現了Bug是不是2個系統都要修改?
若需要改進了,兩個版本是不是都要進行改進?要測試呢?一般情況下,維護1套系統的2個版本是很不實際的
很少有人有能力能做到。就像一個人同時談兩個女朋友一樣,很難搞定。
我們寫得系統稍微複雜一些,都會是遇到主從表結構的設計,單表的設計還比較簡單,主鍵怎麼産生都容易一些,
問題複雜到主從表了,一定要有嚴謹的主外鍵産生政策,否則很容易亂套、程式運作不穩定,或出現并發問題。
經過很多項目的積累,我總結了以下幾個方法:(主要是産生主鍵及序列号用,相容多種資料庫)
1.獲得一個GUID
2.獲得一個Sequence,序列号,做為表的主鍵,外鍵等。
3.獲得一個Degression,降序的序列号,主要是排序時用。
4.批量獲得BatchSequence,一次性獲得多個主鍵,主要是為批量操作提高性能用。
5.獲得指定長度,指定啟始的 Sequence,主要是為了生成有序列規則的單号。
6.删除一個主鍵Delete,沒必要用的主鍵生成器,可以删除掉,系統裡垃圾太多了會不太爽。
理想狀态是,程式稍微修改一下配置,告訴系統,我現在用的是哪個資料庫就可以了,程式都能
平滑運作,這樣遇到遇到不通的資料庫,都沒多大關系,程式都是可以用的,大家也不用太擔心了。
有以上幾個方法,就可以很容易搞定,資料的排序問題、主鍵問題、序列号産生問題了。
抓幾個測試程式螢幕給大家看看。
運作後的效果
排序資料時用的頁面例子參考
序列産生時,還有一個注意的問題,就是若是采用了事務,最好是是在同一個事務裡。
區域及多個主機産生的序列号問題解決方法如事宜圖,Prefix字首方式,可以設定序列的字首,
友善資料合并及分布式運作環境。說實話其實很像Oracle裡的序列産生器。
附件為源代碼及MySql資料庫,有興趣的朋友,可以下載下傳看看。
<a href="http://files.cnblogs.com/jirigala/Example_Sequence.rar">http://files.cnblogs.com/jirigala/Example_Sequence.rar</a>
<a href="http://files.cnblogs.com/jirigala/DotNet.Common.Example.rar">http://files.cnblogs.com/jirigala/DotNet.Common.Example.rar</a>
CREATE TABLE `base_sequence` (
`ID` VARCHAR(40) NOT NULL DEFAULT '',
`FullName` VARCHAR(40) NOT NULL DEFAULT '',
`Prefix` VARCHAR(20) DEFAULT NULL,
`Separate` VARCHAR(20) DEFAULT NULL,
`Sequence` INTEGER(11) NOT NULL,
`Degression` INTEGER(11) NOT NULL,
`Step` INTEGER(11) NOT NULL,
`Description` VARCHAR(200) DEFAULT NULL,
PRIMARY KEY (`ID`)
)
COMMIT;
INSERT INTO `base_sequence` (`ID`, `FullName`, `Prefix`, `Separate`, `Sequence`, `Degression`, `Step`, `Description`) VALUES
('10000000', 'Base_Sequence', NULL, NULL, 10000025, 10000000, 1, '預設值');
本文轉自 jirigala 51CTO部落格,原文連結:http://blog.51cto.com/2347979/451729,如需轉載請自行聯系原作者