有意義的編碼

2021-05-26 21:35:23 字數 1256 閱讀 2788

現象描述:

使用有意義的編碼作為一條記錄的id,甚至作為資料庫的主鍵存在,例如,乙個員工的編碼設定為0203004,其中02代表員工所在分公司,03代表員工所在部門,004代表員工進入到該部門的序號。

原因分析:

id的設定方式大概有以下幾種,一種是純粹的流水號,從1開始,每次加1,或者對其將以改進,將數字轉換成為字串的格式,比方說「0000001」;一種是無意義的隨機編碼,比方說guid;還有一種就是有意義的編碼,特定的位數會代表一定的意義。

問題所在:

其實有意義的編碼會導致很多問題,請看:

問題一:對編碼資源的浪費。如果是純粹的流水號,那麼從1到10000就可以代表一萬條記錄,但是,如果使用有意義的編碼,很可能1000條記錄就會讓五位的編碼不夠用。我就遇到過真正的情況,我們公司的投保單號碼的第一位就是有意義的,代表的時該投保單所屬的渠道,後面跟著很長的一串數字(9位)。理論上來說,這些編碼永遠都不會用完,但是,最開始的三個渠道使用的是1、4、7三個編碼,但是一次新保險法的實行,導致原有的投保單作廢,於是又啟用了三個數字2、5、8,接下來公司改名,三個渠道又分別將投保單報廢,重新啟用新的開頭數字,就這樣,短短的幾年間,所有的投保單號碼全都被用完了,其實列印出來的投保單不過100萬張。

問題二:不一定是唯一的,難以作為主鍵。想一下,我們的身份證號碼就是這樣的。原先15位的時候,後三位是序號,而男性會使用奇數,女性會使用偶數,這樣就是說,乙個地區同一天生日的人,男女都不能超過500人,否則就會導致號碼的重複,儘管出現這種現象的概率比較低,但是還是客觀存在的。

問題三:代表的意義不一定準確。比方說用帶有意義的編碼來為員工定義工號,其中可能會有部門、職務等等意義,但是如果員工在部門間發生了調動,或者職級發生了改變,是否需要改變他的編碼呢?改變吧,那麼所有的歷史資料都要隨之修改一次,工作量會非常大;不改變吧,那麼代表的意義就不再準確,我們就無法從編碼中得到該員工準確的資訊。

解決方案:

所以,對於編碼,非常不建議使用有意義的編碼,要麼使用純粹的流水號,但這樣可能需要定義乙個範圍比較大的型別,對於海量記錄的資料,可能會不夠用;那樣的話就可以使用guid,這樣編碼永遠都不會重複,而且會有大量的編碼資源可用。

在資料庫設計的過程中,有一些在非常多系統中都使用了,但是卻帶來了很多問題的方法,對於這種情況,我們就應該仔細思考,然後痛下決心,堅決抵制。

有意義的開始

今天真的是很值得紀念的一天,來深圳第一次過得這麼充實。原因很簡單有希望 有盼頭 第一次主動約mm出去玩 好像不是約會,是兩位兄弟幫忙約的,呵呵,再次感謝兩位好兄弟的幫助 值得紀念。一直比較膽小,尤其是現在這種處境,完全沒有什麼信心,自己真是太膽小了,總是想著兩位兄弟幫忙打頭陣,為自己鋪路,好像不大好...

Working Practice 有意義大於形式

近來我堅持寫部落格一段時間,感覺收穫很多。通過把自己的想法,思考,理解記錄在部落格裡,有下面的優點 可以不用擔心會忘記這些東西。對自己的成長也有了一定的積累。一直保持了學習思考的習慣。開始的時候我也在想,每篇部落格是不是都需要很精闢,讓別人看上去感覺很棒,這種想法一直讓我成為長期以來不寫部落格的藉口...

Clean Code 有意義的名字

最近在看clean code 整潔之道 裡面有些內容還是不錯的,所以給大家分享下。意思是說名稱和意思要一致,更精確的說應該是看到名字就能想到意思。對程式設計師來說取名通常是一件麻煩的事情,尤其是取乙個好的名字。這裡擷取一段書中的 public list getthem return list1 這段...