[解決済み] 複数テーブルへの外部キー
質問
私のデータベースには、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フィールドを介して、グループまたはユーザーによって所有されることができます。
はどうなるのでしょうか? 最も適切な チケットとユーザーまたはグループとの間のこの関係を記述する方法を教えてください。
チケットテーブルの中に、どのようなタイプが所有しているかというフラグを追加するべきだと考えています。
どのように解決するのですか?
いくつかの選択肢がありますが、どれも正しさや使いやすさはまちまちです。いつものように、正しいデザインはあなたのニーズによって異なります。
-
単純にTicketにOwnedByUserIdとOwnedByGroupIdという2つのカラムを作成し、それぞれのテーブルに対してNullable Foreign Keysを持つことができます。
-
チケット:ユーザーとチケット:グループの関係を可能にするM:M参照テーブルを作成することができます。おそらく将来的には、1つのチケットを複数のユーザやグループが所有できるようにしたいと思うのではないでしょうか?このデザインは、チケット が必要です。 は、単一のエンティティによってのみ所有されます。
-
すべてのユーザーに対してデフォルトグループを作成し、チケットは単に真のグループまたはユーザーのデフォルトグループのいずれかに所有させることができます。
-
または(私の選択ですが)UsersとGroupsの両方のベースとして機能するエンティティをモデル化し、そのエンティティによってチケットを所有させます。
投稿されたスキーマを使った大まかな例です。
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
)
関連
-
[解決済み】SQL Server データベース復元エラー:指定されたキャストは有効ではありません。(SqlManagerUI)
-
[解決済み] try catch ブロックで @@trancount > 0 を確認する必要があるのはどのような場合ですか?
-
[解決済み] データ損失の可能性があるため、スキーマの更新を終了します。
-
[解決済み] 一括読み込みができません。オペレーティングシステムのエラーコード5(アクセスが拒否されました。)
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] データベース内の全テーブルのサイズを取得する
-
[解決済み] TSQLを使用してデータベース内のすべてのテーブルのリストを取得するにはどうすればよいですか?
-
[解決済み] T-SQLを使用して外部キー制約を一時的に無効にするにはどうすればよいですか?
-
[解決済み] SQL Serverで、指定したテーブルを参照しているすべての外部キーを一覧表示するにはどうすればよいですか?
-
[解決済み] 外部キーは自動的にインデックスを作成しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】フラットファイルの日付カラムで「キャスト指定に無効な文字値があります」を修正する方法とは?
-
[解決済み] プロシージャは 'ntext/nchar/nvarchar' 型のパラメータ '@statement' を想定しています。
-
[解決済み] TEXTIMAGE_ON [PRIMARY]とは何ですか?
-
[解決済み] SSISの日付と時刻の連結
-
[解決済み] UPDATEエラーです。"REPLACEの引数1の引数データ型textは無効です"
-
[解決済み] 文字列から特定の文字を削除する
-
[解決済み] SQLサーバーを使用して文字列を切り詰める方法
-
[解決済み] スカラー変数を宣言する必要があります。
-
[解決済み] SQL ServerでGROUP BYと一緒にDISTINCTを使用する
-
[解決済み】データベースで継承を表現するには?