別のアプローチは、潜在的な各リソースタイプの列を含む関連付けテーブルを作成することです。この例では、2つの既存の所有者タイプのそれぞれに独自のテーブルがあります(つまり、参照するものがあることを意味します)。これが常に当てはまる場合は、次のようにすることができます。
CREATE TABLE dbo.Group
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.User
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.Ticket
(
ID int NOT NULL,
Owner_ID int NOT NULL,
Subject varchar(50) NULL
)
CREATE TABLE dbo.Owner
(
ID int NOT NULL,
User_ID int NULL,
Group_ID int NULL,
{{AdditionalEntity_ID}} int NOT NULL
)
このソリューションでは、データベースに新しいエンティティを追加するときに新しい列を追加し続け、@ Nathan Skerlによって示される外部キー制約パターンを削除して再作成します。このソリューションは@Nathan Skerlに非常に似ていますが、見た目は異なります(好みによります)。
新しい所有者の種類ごとに新しいテーブルを作成する予定がない場合は、潜在的な所有者ごとに外部キー列の代わりにowner_typeを含めるとよいでしょう。
CREATE TABLE dbo.Group
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.User
(
ID int NOT NULL,
Name varchar(50) NOT NULL
)
CREATE TABLE dbo.Ticket
(
ID int NOT NULL,
Owner_ID int NOT NULL,
Owner_Type string NOT NULL, -- In our example, this would be "User" or "Group"
Subject varchar(50) NULL
)
上記の方法を使用すると、所有者タイプをいくつでも追加できます。Owner_IDには外部キー制約はありませんが、他のテーブルへの参照として使用されます。欠点は、スキーマに基づいてすぐに明らかになるわけではないため、所有者のタイプを確認するためにテーブルを参照する必要があることです。所有者のタイプが事前にわからず、他のテーブルにリンクされない場合にのみ、これをお勧めします。所有者のタイプを事前に知っている場合は、@ Nathan Skerlのようなソリューションを使用します。
SQLを間違えたら申し訳ありませんが、これを一緒に投げました