物理數據庫設計 - 限定列的有效值

1、說明問題

  其實這篇很是簡單,由於你們都是用這個方法解決的,我決定用本身的語言來描述清楚這一個問題。javascript

  假設,咱們有一個列,這個列只可以取某些有效值。好比一個用戶表,咱們有一個姓氏列,咱們須要限定裏面的值爲中國的姓氏,好比:趙錢孫李周吳鄭王馮陳褚衛蔣沈韓楊。html

2、反模式

  對於這個問題,其實只有初學者可能會用這個方法,就是使用CHECK約束或者觸發器來限定列的值,好比:java

  CHECK (lastname IN ('','','','')); 

  這樣作的缺點以下:git

  一、獲取全部可選值有困難,假設我要作個下拉列表,讓用戶選擇可供輸入的姓氏,那麼SQL語句就複雜了,你須要查詢系統視圖。數據庫

  二、添加可選值,假如咱們要增長一個外國的姓氏。那麼你須要修改CHECK約束或觸發器。數據庫設計

  三、刪除可選值,假設從今天起又不支持外國姓氏了,可是數據庫中又已經有了一個外國姓氏,你不得不保留這一個廢棄值。但下拉列表框中又不能再讓用戶選,這下麻煩大了。post

  四、移植性差,CHECK,約束,觸發器的語法在各類數據庫不相同,移植難度大。this

3、解決方案

  建立一張檢查表,每一行包含容許姓氏出現的值,而後定義一個外鍵約束。spa

  這個你懂的,再也不廢話。設計

  除非,你很肯定這些值不會變時,你可使用CHECK約束或觸發器等手段實現。例如性別:男,女。不然,仍是使用檢查表的方式比較好。

 
 
 
0
0
 
(請您對文章作出評價)
 
« 上一篇: NHibernate 幫助類(單例實際運用)
» 下一篇: 物理數據庫設計 - 文件是否應該存儲在數據庫中
相關文章
相關標籤/搜索