SQL Server 2008 R2で、ユーザーが独自のサブタイプをカテゴリに配置できるデータベースを構築しようとしています。私は、(私によって定義された)プリセットカテゴリ名を保持する親テーブルを持っています。複合キーが存在するときに一意のIDフィールドが主キーに含まれない
私が直面している問題は、PRIMARY KEY
とUNIQUE
の制約と外部キーに関する問題を扱う最良の方法です。サブテーブル(私たちはCategoryTypes
と呼ぶ)が時間とともにかなり大きくなり、親テーブル(Categories
)に基づいてデータから効率的に読み込みを可能にする必要があると予想しているので、インデックス作成が中心です。テーブルが次のように配置されている場合、私は予想する必要がある問題はありますか?
私の懸念は、CategoryTypes
テーブルのIDENTITY
列が一意のカウントを維持する必要があることです。私がこのフィールドを含む理由は、アプリケーション内の層の間でデータを渡すときに、より簡単な参照を許可するためです。 Integer対Integer/Stringの組を渡すことによって。これらのテーブルのデータは、帯域幅を節約するためにデータベースの各レイヤーで保持されます。データベースの観点からは、一度配置すると、以下のレイアウトに大きな問題が生じますか?
簡略化するために、コンポジットキーが存在するときにプライマリキーに含まれない一意のIDフィールド(IDENTITY
)を使用する際に問題がありますか?
親表:
CREATE TABLE schema.Categories
(
Id TINYINT PRIMARY KEY NOT NULL,
Name VARCHAR(100) NOT NULL,
)
サブテーブル(ユーザ時間をかけてデータを挿入する):
CREATE TABLE schema.CategoryTypes
(
Id INT IDENTITY(1,1) NOT NULL,
CategoryId TINYINT REFERENCES schema.Categories(Id) NOT NULL,
Name VARCHAR(100) NOT NULL,
CONSTRAINT PRIMARY KEY CLUSTERED(CategoryId, Name)
CONSTRAINT UC_CategoryTypesId UNIQUE NONCLUSTERED(Id)
)
PSを - 私もそれが必要であるので、サブテーブル「CategoryTypes」でIdが...外部キーの関係などを介して他のテーブルによって参照されることを追加します。テーブルデザインでこのような複雑さに対処するベストプラクティスを公開しています。 –
セカンダリインデックスはクラスタ化されたテーブルでは高価です。あなたが代理キー '{Id}'を本当に必要としないなら、それをまったく使用せず、自然キー '{CategoryId、Name}'だけを使用してください。両方のキーが必要な場合は、ヒープベースのテーブル(つまり、「PRIMARY KEY NONCLUSTERED」)を使用します。 –
Branko、私は余分なオーバーヘッドを認識していますが、この文脈でこれを繰り返していただきありがとうございます。私が直面している課題は、代理ID(外部キー)を参照する必要があることです。私は、あなたが複合的な外部キーを行うことができると思います...しかし、私はこれに慣れていません。代理人は物事をもっと楽にするようです。つまり、あなたとジャスティンの両方が推奨しているように、「CLUSTERD」索引付けを「NONCLUSTERED」にすることから始めることができます。パフォーマンスが必要な場合は、後で私はいくつかの生産データを持っています。 CRUDでは - クラスタ化インデックスは「読み込み」を助けますが、オーバーヘッドをかけることがあります。 –