Sql-Server
分區表上的複合主鍵和外鍵
我們有一個數據庫,其中幾個表被分區。這些表的主鍵(為簡潔起見,PK)的形式為
- 交易日期,ID
其中transaction_date是分區鍵,id是唯一的整數列。如果我們沒有對錶進行分區,那麼我們只會使用id作為 PK。
我們還有其他幾個需要外鍵 (FK) 來引用這些分區表的表。我無法決定是使用複合 FK(引用 PK 的兩列)還是使用單列 FK(引用唯一索引支持的id列)。
這兩種方法有什麼優點/缺點嗎?到目前為止,我能想到的唯一因素(我什至可能在這些方面錯了)是:
- 單列 FK:降低應用程序開發的複雜性。
- 複合 FK:在加入 FK 列時允許消除分區。
分區方案中涉及的所有唯一約束****必須將分區列定義為基本索引定義(索引鍵的子集)的一部分 - (不僅僅是包含的列)。換句話說,在這種情況下,您將無法僅在
ID
列上創建唯一約束。設置分區函式和方案。
CREATE PARTITION FUNCTION [PF_dbo_Test] (DATE) AS RANGE RIGHT FOR VALUES ('2018-01-01','2018-02-01','2081-03-01') GO CREATE PARTITION SCHEME [PS_dbo_Test] AS PARTITION [PF_dbo_test] TO ([PRIMARY],[PRIMARY],[PRIMARY],[PRIMARY])
創建一個
PRIMARY KEY
引用分區方案的表。IF OBJECT_ID('[dbo].[Test]') IS NOT NULL DROP TABLE [dbo].[Test] GO CREATE TABLE [dbo].[Test] ( [TransactionDate] DATE ,[ID] INT CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED ([TransactionDate] ASC) ) ON PS_dbo_Test (TransactionDate)
現在,嘗試在不指定分區列的情況下在分區表上創建唯一約束。
CREATE UNIQUE NONCLUSTERED INDEX [UX_Test] ON [dbo].[Test] ([ID] ASC) WITH ( PAD_INDEX = OFF ,STATISTICS_NORECOMPUTE = OFF ,SORT_IN_TEMPDB = OFF ,IGNORE_DUP_KEY = OFF ,DROP_EXISTING = OFF ,ONLINE = OFF ,ALLOW_ROW_LOCKS = ON ,ALLOW_PAGE_LOCKS = ON )
消息 1908,級別 16,狀態 1,第 17 行列“TransactionDate”是索引“UX_Test”的分區列。唯一索引的分區列必須是索引鍵的子集。
所以,當你問這個問題時:
我無法決定是使用複合 FK(引用 PK 的兩列)還是使用單列 FK(引用唯一索引支持的 id 列)。
恐怕 SQL Server 已經為您做出了決定。您必須同時使用
TransactionDate
AND定義您的 FKID
。