資料庫設計之主鍵的思考,資料庫主鍵思考

來源:互聯網
上載者:User

資料庫設計之主鍵的思考,資料庫主鍵思考

    根據第二範式,主鍵是必須的。主鍵還是是唯一的,主鍵也被作為外鍵引用建立表和表之間的關係。從這幾個方面討論主鍵(資料庫是Oracle):

    1.主鍵的命名

    最近看到由於架構使用hibernate的原因,導致所有主鍵的命名是ID,我覺得非常糟糕,如部門表(department),使用者表(user),角色表(role),這些表如果關聯都是id之間關聯,非常難辨認這個叫ID是那張表的,如果改為department_id,user_id,role_id是不是很舒服,一看就知道是那張表的ID。可惜架構限制,即使開發人員不斷抱怨,也沒辦法。

    2.選什麼欄位做為主鍵

    選擇主鍵是找一個自然鍵(與業務有關係的鍵),還是建一個與業務模型毫無關係的鍵呢?打個比方:

    部門表(department)有個部門code是唯一的,編碼規則如,

           百度公司  01

           百度公司/研發部 0101

           百度公司/研發部/搜尋引擎開發組 010101

    裝置表(device)有裝置code這個欄位,這個欄位是根據裝置的一些屬性產生的一個唯一標識。

    我的建議是建一個毫無業務意義的欄位,原因是什麼呢?

     部門是會調整的,一個部門從這個大部門下調整到其他的大部門下是常有的事情,有很多業務關聯的部門的資訊,如果基表進行調整,那需要把業務的資料都重新整理了。

     裝置表的code也可能會變,因為裝置類型每年都有調整,只要一調整code就變化了,同部門一樣。

     說到這有兄弟不服氣了,我們公司的裝置表code不調整。我想說的是你不可能預測未來,只要是業務,都可能會發生變化。

   3.主鍵是選擇序列還是uuid

     如果你的系統是小系統,資料量不大,那就沒有什麼講究。

     a.如廣東有21個地市局,在每個局都發布一個系統,每天都要把地市局的資料幫浦到省公司整合。要是用序列,要把序列前面加上這個局的標記,如果不做任何加工,把資料幫浦到省公司整合會很難過的。如果用uuid則不需要考慮這個問題,人家號稱全球唯一。

     b.用序列,uuid哪個效能好?這個我還真測試過,uuid沒有序列效能好,只是差一點點,可以忽略。uuid是32位的varchar2,佔用空間比序列大多了,所以效能差點不足為奇。哪不是說任何情境序列就比uuid好呢?不能這麼說,序列有一個問題,是我長期的效能調優發現的,用序列可能造成SQL語句時快時慢的問題。如果正常使用序列,主鍵是連續的,不會出現問題,難的是有時候不可能,如你的部門id從1到100,由於資料移轉的原因,你想區分以前的部門id和遷移後的,你把序列從10000開始,這樣會造成資料不均勻。如果你知道長條圖,綁定窺探,那我就不用解釋了。

   4.還有一個特殊的情況,現在有部門表(department),使用者表(user),還有一張關聯表,這種關聯表可能會出現重複的問題。

    create  table dept_user_relation

    (

       relation_id  NUMBER(18)primary  key,

       department_id NUMBER(18),

       user_id   NUMBER(18)

    );

    RELATION_IDDEPARTMENT_ID    USER_ID

   ----------- ------------- ----------

          1           100        100

          2           100        100

          3           100        100

     你會發現主鍵relation_id沒起作用啊!是的,需要在department_id和user_id上加唯一約束,當你加了約束,你又會發現要這個relation_id有什麼用呢?是的,它可能沒有用。

    a.如果relation_id沒有被其他的表作為外鍵引用,你可以用department_id和user_id聯合起來作為主鍵。但我覺得留著也沒啥問題,當然,如果你是處女座,那隻有刪除relation_id。

    b.如果relation_id被其他的表作為外鍵引用,建議你還是保留吧,還不然不好弄。

   這一小節我想說的是主鍵的本質就是一個約束,標示唯一性。


資料庫設計中主鍵的作用?

用以唯一標識一條記錄。
參見資料庫範式。
 
資料庫設計每張表是否都需要設計一個主鍵

不一定都需要設定主鍵,可以根據需要設定聯合主鍵,比如:
商品表
(商品ID,名稱,單價。。。。。。)
銷售表
(商品ID,銷售時間,金額,。。。。。)
第一張表可以設商品ID為主鍵,因為,商品ID是不可以重複的
第二章表是不可以將商品ID設為主鍵的,因為表裡可能出現N次的同樣商品ID的商品銷售記錄
我們可以將(商品ID,銷售時間)設為聯合主鍵,也就是unique(商品ID,銷售時間)
 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.