Tim*_*own 7 foreign-key database-design sql-server primary-key partitioning
我们有一个数据库,其中多个表被分区。这些表的主键(为简洁起见,PK)的形式为
其中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])
Run Code Online (Sandbox Code Playgroud)
创建一个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)
Run Code Online (Sandbox Code Playgroud)
现在,尝试在不指定分区列的情况下对分区表创建唯一约束。
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
)
Run Code Online (Sandbox Code Playgroud)
消息 1908,级别 16,状态 1,第 17 行列“TransactionDate”是索引“UX_Test”的分区列。唯一索引的分区列必须是索引键的子集。
所以,当你问这个问题时:
我无法决定是使用复合 FK,引用 PK 的两列,还是使用单列 FK,引用唯一索引支持的 id 列。
恐怕 SQL Server 已经为您做出了决定。您必须同时使用TransactionDate
AND定义 FK ID
。