データベースには関連するテーブルが 3 つあります。
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 int NOT NULL,
Subject varchar(50) NULL
)
ユーザーは複数のグループに属しています。これは多対多の関係によって行われますが、この場合は関係ありません。チケットは、dbo.Ticket.Owner フィールドを介してグループまたはユーザーのいずれかによって所有できます。
何でしょうか最も正しいチケットとオプションでユーザーまたはグループとの間のこの関係を記述する方法はありますか?
チケット テーブルに、どのタイプが所有しているかを示すフラグを追加する必要があると考えています。
ベストアンサー1
いくつかのオプションがあり、それぞれ「正確さ」と使いやすさが異なります。いつものように、適切なデザインはニーズによって異なります。
Ticket に OwnedByUserId と OwnedByGroupId の 2 つの列を作成し、各テーブルに null 許容の外部キーを設定するだけです。
チケット:ユーザーとチケット:グループの両方のリレーションシップを可能にするM:M参照テーブルを作成できます。将来的には、1つのチケットを複数のユーザーまたはグループが所有できるようにしたいと考えるかもしれません。この設計では、チケットが複数のユーザーまたはグループによって所有されることを強制しません。しなければならない単一の組織によってのみ所有される。
すべてのユーザーに対してデフォルト グループを作成し、チケットを実際のグループまたはユーザーのデフォルト グループのいずれかによって所有するようにすることができます。
または (私の選択)、ユーザーとグループの両方のベースとして機能するエンティティをモデル化し、そのエンティティによって所有されるチケットを持ちます。
投稿されたスキーマを使用した大まかな例を次に示します。
create table dbo.PartyType
(
PartyTypeId tinyint primary key,
PartyTypeName varchar(10)
)
insert into dbo.PartyType
values(1, 'User'), (2, 'Group');
create table dbo.Party
(
PartyId int identity(1,1) primary key,
PartyTypeId tinyint references dbo.PartyType(PartyTypeId),
unique (PartyId, PartyTypeId)
)
CREATE TABLE dbo.[Group]
(
ID int primary key,
Name varchar(50) NOT NULL,
PartyTypeId as cast(2 as tinyint) persisted,
foreign key (ID, PartyTypeId) references Party(PartyId, PartyTypeID)
)
CREATE TABLE dbo.[User]
(
ID int primary key,
Name varchar(50) NOT NULL,
PartyTypeId as cast(1 as tinyint) persisted,
foreign key (ID, PartyTypeId) references Party(PartyID, PartyTypeID)
)
CREATE TABLE dbo.Ticket
(
ID int primary key,
[Owner] int NOT NULL references dbo.Party(PartyId),
[Subject] varchar(50) NULL
)