2015-04-02 70 views
1

我正在構建我的第三個數據庫,我不確定如何構建主鍵和唯一約束以確保數據完整性。數據庫設計:主鍵和唯一約束

當公開數據發佈時,數據庫會定期更新,每月一次,每年一次,並且查詢負載較低。

我有一些表中列的組合使每一行都是唯一的。我知道我可以使用複合主鍵,但我不確定這是否是最佳實踐,因爲我閱讀的許多文章都有相互衝突的觀點。

例如,一個表需要的唯一性五列與數據類型:

  • SMALLINT
  • 炭(7)
  • VARCHAR(7)
  • SMALLINT
  • VARCHAR(3)

我相信這會使主鍵高達25字節並且所有這五列將經常被選擇並經常在where子句中使用。其中一個smallint也是一個外鍵,但沒有外鍵會引用這個表。

我知道的唯一選擇是爲每一行創建一個唯一標識符,將其設置爲主鍵並在五列上創建唯一約束。

  1. 什麼是最好的選擇,如果是使用複合主鍵應該是聚簇還是非聚簇?
  2. 是否有一個建議的組合主鍵的最大列數和字節數?
+1

由於沒有外鍵引用此表,沒有下降到複合羣集主鍵。您只需根據查詢表的方式決定哪個列應該是最前面的列,然後爲用戶可能經常搜索的其他列(鍵或不鍵)添加非聚簇索引。 – 2015-04-02 11:58:48

+0

我認爲領先專欄應該是最常用於查詢的專欄?其他欄的順序是否有相關性? – Kieran 2015-04-02 13:03:17

+0

是的,領先列取決於查詢表的方式。例如,如果外鍵列通常作爲一對多標識關係的多邊訪問,那麼將外鍵列指定爲主鍵中的第一個鍵是有意義的。 – 2015-04-03 02:31:07

回答

-1

我不知道你的數據庫的目的是什麼,但首先建議你是否可以添加id列作爲主鍵。每個查詢都會更輕鬆。

然後如果你想僅僅是在同一個表中的列的獨特組合的河畔,簡單的方法是用一個指標是關鍵字UNIQUE:

CREATE UNIQUE NONCLUSTERED INDEX [IX_COLUMN1_COLUMN2] 
ON TABLE(COLUMN1 ASC, COLUMN2ASC); 
+0

我可以添加一個ID列,但如果可能的話,我寧願使用複合主鍵,因爲這與數據有關。 – Kieran 2015-04-02 13:05:52

+0

@Kieran當然你可以保留你的複合鍵。那麼獨特的索引呢?解決你的問題? – Julian50 2015-04-02 13:26:09

+0

這裏的ID列沒有任何用處。五列上的唯一*約束*不是可選的 - 確保數據完整性至關重要。只有ID號碼不會防止這五列中的重複。 – 2015-04-02 13:32:35