主鍵的選擇 和 如何減少多外來鍵

2021-08-31 08:49:58 字數 1897 閱讀 5662

這個靈感**於多日問題的集結:

還是從例項開始:

假定有以下模組:

新聞模組

藝術家模組

藝術實體模組(書法、繪畫..)

…那麼我們該怎麼設定這個外來鍵呢?

我僅用過hibernate,就拿hibernate中的主鍵生成策略來說事把!而常用的有

foreign(不考慮,它主要用於多表共用乙個主鍵)

native:根據底層資料庫的能力選擇identity, sequence 或者hilo中的乙個。這個很難保證 主鍵唯一,只有oracle中多表共用乙個序列能實現,其他資料庫就無能為力了,所以cut掉

assigned:由程式設計師指定,這個也比較可取,但是本人比較懶,故不經常用!

uuid:用乙個128-bit的uuid演算法生成字串型別的識別符號, 這在乙個網路中是唯一的(使用了ip位址)。uuid被編碼為乙個32位16進製制數字的字串。它其實也是由應用程式來完成的,不過這個應用程式的書寫不是由程式設計師來完成,而是由hibernate自己來完成!

通過上述的說明我們發現使用uuid是最完美的!!!!

/************************華麗的分割線********************/

說到這裡,我們再談談「外來鍵」。使用外來鍵,是因為兩張表中的某兩條記錄之間存在了「指向」關係。

而這個指向關係可以是表級別的指向還可以是**級別的指向!什麼意思?

舉個例子:「學生甲記錄」中有乙個欄位classid指向「班級a的主鍵」。

表級別的指向是說,這個外來鍵關係在表中得到了體現:拿上面的例子就是說學生甲所在的表學生表有乙個外來鍵!此時如果這個外來鍵可以為空,那麼這個學生表中的所有學生記錄的classid的值要麼是null,要麼是班級a所在錶即班級表中所有記錄的主鍵值之一,不可能是其他值。

**級別的指向是說,這個外來鍵關係並沒有在表中得到體現,還拿上面的例子說事,學生甲所在的表學生表沒有外來鍵,此時這個學生表中的所有學生記錄的classid的值可以是null,可以是班級a所在錶即班級表中所有記錄的主鍵值之一,也可以是其他任何classid型別的值!但是我們最終要達到的效果是「表級別」所達到的效果即:當這個外來鍵可以為空時,學生表中的所有學生記錄的classid的值要麼是null,要麼是班級a所在錶即班級表中所有記錄的主鍵值之一,不能是其他值。所以要靠程式設計師用程式來控制!說白了,**級別的指向沒有使用外來鍵!

那麼採用哪種方式比較好呢?表級別的指向,還是**級別的指向?

我們說使用了「表級別的指向」即真正的使用了外來鍵,可以保證「當這個外來鍵可以為空時,學生表中的所有學生記錄的classid的值要麼是null,要麼是班級a所在錶即班級表中所有記錄的主鍵值之一,不能是其他值。」

換句話就是說:

使用表級別的指向,當我們在插入一條學生記錄的時候,資料庫會檢查classid的值,如果classid=null,看外來鍵是否允許為空,如果要求不能為空,則插入失敗;而使用**級別的指向時,資料庫不檢查,直接插入;如果classid不為null,使用表級別的指向,資料庫會檢查classid的值是否是class表中所有記錄主鍵之一,如果不是,則插入失敗,而使用**級別的指向時,資料庫不檢查,直接插入;

如果我們能夠在**級別控制好學生的classid,要麼為null,要麼只能是班級表所有記錄的主鍵之一,豈不更好!這樣看的話 **級別的指向 彷彿好一些!!它能大幅度的降低資料庫表表間的複雜關係!這個非常重要!

我們再回頭看看hibernate:

如果要實現「表級別的指向」即真正使用外來鍵,就必須在實體類中建立物件的引用,例如:classes classes; set students,並在對映檔案中進行配置相應的關係!

如果要實現**級別的控制,我們只需要乙個「物件識別符號」型別的屬性即可,例如int classid即可完事,而且在一的一端類裡(class)也不需要額外的屬性!

但是,如果從延遲載入的角度來看,使用了「**級別的控制」時就失去了延遲載入這個hibernate非常重要的亮點!

主鍵和外來鍵

主鍵和外來鍵是把多個表組織為乙個有效的關聯式資料庫的粘合劑。主鍵和外來鍵的設計對物理資料庫的效能和可用性都有著決定性的影響。必須將資料庫模式從理論上的邏輯設計轉換為實際的物理設計。而主鍵和外來鍵的結構是這個設計過程的癥結所在。一旦將所設計的資料庫用於了生產環境,就很難對這些鍵進行修改,所以在開發階段...

主鍵和外來鍵

主鍵的存在就代表著表結構的完整性,表的記錄必須得有唯一區分的字段,主鍵主要是用於其他表的外來鍵關聯,本記錄的修改與刪除,當我們沒有主鍵時,這些操作會變的非常麻煩。我強調主鍵不應該具有實際的意義,這可能對於一些朋友來說不太認同,比如訂單表吧,會有 訂單編號 字段,而這個欄位呢在業務實際中本身就是應該具...

主鍵和外來鍵

關係型資料庫中的某乙個屬性組能唯一標識一條記錄,該屬性組就可以成為乙個主鍵 主鍵只能有乙個,不能有重複的,不允許為空,用來保證資料完整性 外來鍵用於與另一張表的關聯。是能確定另一張表記錄的字段,用於保持資料的一致性。表的外來鍵是另一表的主鍵,外來鍵可以有重複的,可以是空值。用來和其他表建立聯絡用的 ...