複数のテーブルが分割されたデータベースがあります。これらのテーブルの主キー(簡潔にするためにPK)は、次の形式です。
ここで、transaction_dateはパーティション化キーであり、idは一意の整数列です。テーブルをパーティション分割しない場合は、PKとしてidのみを使用します。
これらのパーティションテーブルを参照するために外部キー(FK)を必要とする他のいくつかのテーブルがあります。 PKの両方の列を参照する複合FKを使用するか、一意のインデックスでサポートされるid列を参照する単一列FKを使用するかを決定できません。
どちらのアプローチにもメリット/デメリットはありますか?これまでのところ、私が考えることができる唯一の要因は(そして私はこれらについて間違っているかもしれません):
単一列FK:アプリ開発の複雑さを軽減します。
複合FK:FK列で結合するときにパーティションを削除できます。
[〜#〜] all [〜#〜]パーティショニングシナリオに関係する一意の制約[[〜#〜] must [〜#〜]パーティション列が一部として定義されているベースインデックス定義(インデックスキーのサブセット)単に含まれている列ではありません)。つまり、---(justの一意の制約を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'のパーティション列です。一意のインデックスのパーティション列は、インデックスキーのサブセットである必要があります。
だから、あなたが質問をするとき:
PKの両方の列を参照する複合FKを使用するか、一意のインデックスでサポートされるid列を参照する単一列FKを使用するかを決定できません。
SQL Serverがあなたのために決定したと思います。 FKはTransactionDate
AND ID
の両方で定義する必要があります。