我正在嘗試在SQL Server 2008 R2中構建一個數據庫,該數據庫將允許用戶將他們自己的子類型放入類別中。我有一個父表,其中包含預設的類別名稱(由我定義)。當組合鍵存在時,主鍵中不包含唯一ID字段
我面對的問題是什麼是處理PRIMARY KEY
和UNIQUE
約束以及外鍵參考的最佳方法。因爲我預計子表(我們稱之爲CategoryTypes
)隨着時間的推移會變得相當大,並且需要能夠有效地允許基於父表(Categories
)從數據中讀取數據,所以索引是其中心。我需要預測是否有任何問題需要預測表格是否如下佈置:
我擔心CategoryTypes
表中的IDENTITY
列需要維護一個唯一的計數。我包含這個字段的原因是在應用程序中的層之間傳遞數據時允許更簡單的引用。通過傳遞整數與整數/字符串對。這些表中的數據將保留在數據庫的每一層以節省帶寬。從數據庫的角度來看,下面的佈局是否會在部署後面臨任何重大挑戰?
爲了簡化,使用複合鍵存在時未包含在主鍵中的唯一ID字段(IDENTITY
)是否存在問題?見下面表格佈局:
父表:
CREATE TABLE schema.Categories
(
Id TINYINT PRIMARY KEY NOT NULL,
Name VARCHAR(100) NOT NULL,
)
分臺(一段時間內的用戶插入的數據):
CREATE TABLE schema.CategoryTypes
(
Id INT IDENTITY(1,1) NOT NULL,
CategoryId TINYINT REFERENCES schema.Categories(Id) NOT NULL,
Name VARCHAR(100) NOT NULL,
CONSTRAINT PRIMARY KEY CLUSTERED(CategoryId, Name)
CONSTRAINT UC_CategoryTypesId UNIQUE NONCLUSTERED(Id)
)
PS - 我還要補充的是,標識在子表「CategoryTypes」將被其他表作爲通過外鍵關係引用...所以它是必要的。我願意接受任何解決餐桌設計複雜問題的最佳實踐。 – 2012-03-03 20:03:08
請注意,集羣表中的次要索引是昂貴的。如果您確實不需要代理鍵'{Id}',那麼請不要使用它,只需使用自然鍵'{CategoryId,Name}'。如果你想要兩個鍵,使用一個基於堆的表(即'PRIMARY KEY NONCLUSTERED')。 – 2012-03-04 02:14:25
Branko,我知道額外的開銷,但是謝謝你在這種情況下重申這一點。我面臨的挑戰是我知道我需要引用代理ID(外鍵)。我想你可以做一個複合外鍵......但我對此並不是很熟悉。代理似乎讓事情變得更容易。也就是說,我可以從消除「CLUSTERD」索引開始,贊成「NONCLUSTERED」,因爲你和Justin都建議。如果稍後需要性能,在獲得一些生產數據後,我總是可以解決性能問題。在CRUD中 - 聚集索引有助於「閱讀」,但可以投入開銷。 – 2012-03-04 17:27:19