跳轉到內容

關係資料庫設計/約束

來自華夏公益教科書,開放的書籍,開放的世界

約束是除了域之外,進一步限制資料的方式。約束也用於強制參照完整性,這可以防止邏輯上不完整的資料駐留在資料庫中。

主鍵是唯一標識表中特定行的列。例如,實體可能有一列用於SSN(社會安全號碼)。如果在您的資料模型中每個人都有唯一的 SSN,那麼它可能是主鍵的候選。(主鍵可以由兩列或多列組成,但這在這裡不討論。)

主鍵也是外部索引鍵工作的方式。因此,SSN 可能實際上不是一個好的主鍵選擇。在實踐中,行通常有一個唯一的數字識別符號(通常稱為標識序列值),它唯一標識特定行。這些型別的值通常用作主鍵。

需要注意的是,RDBMS 通常使用表的 主鍵的列(或列)自動建立該表上的結構化索引。結構化索引是在物理上對資料進行重新排序以匹配索引的索引。這樣做是為了提高查詢效能,但如果使用錯誤的列作為主鍵,實際上會降低效能。

在關係理論術語中,主鍵是選定的候選鍵,它是最小的屬性集,其在每行(元組)中的例項組合始終是唯一的,並且標識行(元組)。候選鍵是最小的超鍵,超鍵是任何屬性集(列),它們將標識行,而最大的超鍵是表的整個列集(關係的屬性)。

外部索引鍵

[編輯 | 編輯原始碼]

外部索引鍵是進一步限制列的允許值,使其僅包含另一個表中存在的資料的一種方式。例如,如果您必須在您的系統中處理訂單,您可以建立一個名為OrderInfo的表來儲存訂單資訊。訂單必須與客戶相關聯,因此您可以在OrderInfo表中有一個名為CustomerID的列,它以某種方式連線到Customer表中的相關行。

最有可能的是,您不想能夠為不存在的客戶建立訂單,也不想刪除與任何訂單相關的客戶。這樣做會導致資料參照完整性失效。外部索引鍵關係確保執行這兩個規則。

透過在OrderInfoCustomerID列和Customer表的主鍵之間建立外部索引鍵關係,RDBMS 將確保CustomerID始終引用Customer表中的一行,並阻止您刪除該關聯的行,因為OrderInfo中的一行或多行依賴於它。

通常,具有外部索引鍵約束的表透過該表的主鍵屬性引用另一個表。例如,在多對一關係中,例如 Orders 是多個,Customer 是一個,每個 Customer 行都有多個 Order 行,因此外部索引鍵駐留在 Order 表中。習慣上,外部索引鍵欄位名稱與所引用表的欄位名稱相同,因此最好以冗餘命名方式命名每個表上的主鍵,例如 "TABLENAME_ID",例如 Customer_ID。

其他約束

[編輯 | 編輯原始碼]

可以爭辯說,最重要的約束是外部索引鍵和主鍵約束,因為規範化過程(見下文)將大多數資料完整性檢查推向了主鍵和連線(使用一個表中的外部索引鍵和另一個表中的主鍵檢索行)。

一些 DBMS 提供邏輯 CHECK 約束,其中 CHECK 的主體涉及對一個或多個欄位的某種條件。

NOT NULL 和 UNIQUE 是應用於資料宣告語句 CREATE TABLE ( f1 type1 PRIMARY KEY, f2 type2 UNIQUE , ... CHECK (..) ) 中的單個欄位的約束。

華夏公益教科書