SQL Serverでクラスのいずれかまたはテーブルの継承(Account、CatAccountDetails、DogAccountDetails)を実装したいと思います。
MySQLの推奨事項を見つけました:
IS-A関係をデータベースにマップするにはどうすればよいですか?
基本的には:
単一の値に制限されている型の列(CatAccountDetailsの「C」列など)を追加すると、少しハックに感じるので、これを有効にするSQL Serverの機能があるかどうか疑問に思いましたシナリオ?
また、これがそれを行う方法である場合、追加の何かを定義する必要がありますこの「未使用」列が私のORM(Entity Framework )PKだけに追加の外部キーを作成するようなテーブル結合を要求しますか?
主な問題は、CatAccountDetails
がDogAccountDetails
とは異なる列を持つことです。私のアプリケーションでは、猫は犬よりもはるかに多くの特性を持っています。ちなみに、「猫」と「犬」は、私の現在のシナリオでは、Webサイトメンバーの3つのカテゴリを表しています。
最終的に、私はコメントから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]))
これは、私の求人掲示板での複数の個別のアカウントタイプである採用担当者と候補者の実装にうまく対応しています。