web-dev-qa-db-ja.com

クラステーブルの継承を表す方法(現在のDBMS固有の方法を教えてください)?

SQL Serverでクラスのいずれかまたはテーブルの継承(Account、CatAccountDetails、DogAccountDetails)を実装したいと思います。

MySQLの推奨事項を見つけました:

IS-A関係をデータベースにマップするにはどうすればよいですか?

基本的には:

  • 親テーブル(Account)とサブタイプテーブル(CatAccountDetails、DogAccountDetails)の間で同一の主キーを使用する
  • 親テーブルとサブタイプテーブルにサブタイプ識別子列を追加する
  • サブタイプテーブルから親タイプテーブルへの外部キー制約に共有主キーとサブタイプ列の両方を含める

単一の値に制限されている型の列(CatAccountDetailsの「C」列など)を追加すると、少しハックに感じるので、これを有効にするSQL Serverの機能があるかどうか疑問に思いましたシナリオ

また、これがそれを行う方法である場合、追加の何かを定義する必要がありますこの「未使用」列が私のORM(Entity Framework )PKだけに追加の外部キーを作成するようなテーブル結合を要求しますか?

主な問題は、CatAccountDetailsDogAccountDetailsとは異なる列を持つことです。私のアプリケーションでは、猫は犬よりもはるかに多くの特性を持っています。ちなみに、「猫」と「犬」は、私の現在のシナリオでは、Webサイトメンバーの3つのカテゴリを表しています。

5
shannon

最終的に、私はコメントからypercubeの提案を実装しました:

"type"列は、SQL-Serverの計算された(ただし定数)列として定義できます。外部キー制約に参加できるようにするため、PERSISTEDである必要があると思います。

これはパフォーマンスと私のツール(Entity Framework <= 6.0)との互換性の両方でうまく機能しました:

CREATE TABLE [dbo].[Account](
    [Id] [int] IDENTITY(1000,1) NOT NULL PRIMARY KEY CLUSTERED,
    [CommunityRole] [int] NOT NULL,
    [FirstName] [nvarchar](50) NOT NULL,
    [LastName] [nvarchar](50) NOT NULL,
CONSTRAINT [UX_Derived_Relation] UNIQUE ([Id], [CommunityRole]))

CREATE TABLE [dbo].[Recruiter](
    [Id] [int] NOT NULL PRIMARY KEY CLUSTERED,
    [CommunityRole]  AS ((1)) PERSISTED NOT NULL,
    [RecruiterSpecificValue]  [int] NOT NULL,
FOREIGN KEY ([Id], [CommunityRole]) REFERENCES Account([Id], [CommunityRole]))

CREATE TABLE [dbo].[Candidate](
    [Id] [int] NOT NULL PRIMARY KEY CLUSTERED,
    [CommunityRole]  AS ((2)) PERSISTED NOT NULL,
    [CandidateSpecificValue]  [int] NOT NULL,
FOREIGN KEY ([Id], [CommunityRole]) REFERENCES Account([Id], [CommunityRole]))

これは、私の求人掲示板での複数の個別のアカウントタイプである採用担当者と候補者の実装にうまく対応しています。

4
shannon