web-dev-qa-db-ja.com

分割テーブルの複合主キーと外部キー

複数のテーブルが分割されたデータベースがあります。これらのテーブルの主キー(簡潔にするためにPK)は、次の形式です。

  • transaction_date、id

ここで、transaction_dateはパーティション化キーであり、idは一意の整数列です。テーブルをパーティション分割しない場合は、PKとしてidのみを使用します。

これらのパーティションテーブルを参照するために外部キー(FK)を必要とする他のいくつかのテーブルがあります。 PKの両方の列を参照する複合FKを使用するか、一意のインデックスでサポートされるid列を参照する単一列FKを使用するかを決定できません。

どちらのアプローチにもメリット/デメリットはありますか?これまでのところ、私が考えることができる唯一の要因は(そして私はこれらについて間違っているかもしれません):

  • 単一列FK:アプリ開発の複雑さを軽減します。

  • 複合FK:FK列で結合するときにパーティションを削除できます。

4
TimBrown

[〜#〜] 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の両方で定義する必要があります。

3
Scott Hodgin