Sql-Server

分區表上的複合主鍵和外鍵

  • March 19, 2018

我們有一個數據庫,其中幾個表被分區。這些表的主鍵(為簡潔起見,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 已經為您做出了決定。您必須同時使用TransactionDateAND定義您的 FK ID

引用自:https://dba.stackexchange.com/questions/200474