外键引用两个表
Foreign Key References Two Tables
我目前正在处理数据库,我遇到了一个新问题。涉及的实体是 Universe、Competition、Game、Pot。以下是用于创建 table 的 SQL 文件:
CREATE TABLE Universe (
id int NOT NULL IDENTITY PRIMARY KEY,
history nvarchar (max),
creation_date date
);
CREATE TABLE Pot (
pot_name nvarchar(100),
universe_id int FOREIGN KEY REFERENCES Universe(id),
pot_description nvarchar(100),
media_description nvarchar(100),
is_official_pot bit
PRIMARY KEY (pot_name, universe_id)
);
CREATE TABLE Competition (
universe_id int NOT NULL FOREIGN KEY REFERENCES Universe(id),
compt_name nvarchar(100) NOT NULL,
alias nvarchar(100),
history nvarchar(max),
rules nvarchar (max),
winner_id nvarchar(100) FOREIGN KEY REFERENCES RaulUser(username),
edition int NOT NULL,
is_official_competition bit NOT NULL,
PRIMARY KEY (universe_id, compt_name, edition)
);
CREATE TABLE Game (
id int NOT NULL IDENTITY PRIMARY KEY,
pot_name nvarchar (100) NOT NULL,
universe_id int NOT NULL,
competition_name nvarchar(100) NOT NULL,
competition_edition int NOT NULL,
competition_round int NOT NULL,
home_raul_u_username nvarchar (100) FOREIGN KEY REFERENCES RaulUser(username) NOT NULL,
home_team nvarchar (100) NOT NULL FOREIGN KEY REFERENCES Team(team_name),
home_score int,
away_raul_u_username nvarchar (100) NOT NULL FOREIGN KEY REFERENCES RaulUser(username),
away_team nvarchar (100) NOT NULL FOREIGN KEY REFERENCES Team(team_name),
away_score int,
is_over bit NOT NULL,
played_date date,
FOREIGN KEY (universe_id, competition_name, competition_edition) REFERENCES Competition(universe_id, compt_name, edition),
FOREIGN KEY (universe_id, pot_name) REFERENCES Pot(universe_id, pot_name)
);
问题从最后一个 table(游戏)开始,因为我不能将 universe_id 用作不同 table 的外键。解决这个问题的最佳方法是什么?创建一个 M:M table Game_Pot?
我只需要记录每场比赛的 Pot,因为 Pots 会随着时间的推移而变化,我不想丢失这些数据。
抱歉这么久 post 并提前感谢大家 :)
我看到的唯一问题是 table Game
的定义:
FOREIGN KEY (universe_id, pot_name) REFERENCES Pot(universe_id, pot_name)
列的顺序很重要。 tablePot
的主键是(pot_name, universe_id)
,所以需要交换外键中的列,像这样:
FOREIGN KEY (pot_name, universe_id) REFERENCES Pot(pot_name, universe_id)
请注意,在每个 table 中具有 identity
(或 the-like)主键可能会简化您的设计:这将允许您减少子 [=] 中的列数24=]s,并使用 single-column 外键。同时,您仍然可以在具有唯一约束的父 table 中对列元组强制执行唯一性。
我目前正在处理数据库,我遇到了一个新问题。涉及的实体是 Universe、Competition、Game、Pot。以下是用于创建 table 的 SQL 文件:
CREATE TABLE Universe (
id int NOT NULL IDENTITY PRIMARY KEY,
history nvarchar (max),
creation_date date
);
CREATE TABLE Pot (
pot_name nvarchar(100),
universe_id int FOREIGN KEY REFERENCES Universe(id),
pot_description nvarchar(100),
media_description nvarchar(100),
is_official_pot bit
PRIMARY KEY (pot_name, universe_id)
);
CREATE TABLE Competition (
universe_id int NOT NULL FOREIGN KEY REFERENCES Universe(id),
compt_name nvarchar(100) NOT NULL,
alias nvarchar(100),
history nvarchar(max),
rules nvarchar (max),
winner_id nvarchar(100) FOREIGN KEY REFERENCES RaulUser(username),
edition int NOT NULL,
is_official_competition bit NOT NULL,
PRIMARY KEY (universe_id, compt_name, edition)
);
CREATE TABLE Game (
id int NOT NULL IDENTITY PRIMARY KEY,
pot_name nvarchar (100) NOT NULL,
universe_id int NOT NULL,
competition_name nvarchar(100) NOT NULL,
competition_edition int NOT NULL,
competition_round int NOT NULL,
home_raul_u_username nvarchar (100) FOREIGN KEY REFERENCES RaulUser(username) NOT NULL,
home_team nvarchar (100) NOT NULL FOREIGN KEY REFERENCES Team(team_name),
home_score int,
away_raul_u_username nvarchar (100) NOT NULL FOREIGN KEY REFERENCES RaulUser(username),
away_team nvarchar (100) NOT NULL FOREIGN KEY REFERENCES Team(team_name),
away_score int,
is_over bit NOT NULL,
played_date date,
FOREIGN KEY (universe_id, competition_name, competition_edition) REFERENCES Competition(universe_id, compt_name, edition),
FOREIGN KEY (universe_id, pot_name) REFERENCES Pot(universe_id, pot_name)
);
问题从最后一个 table(游戏)开始,因为我不能将 universe_id 用作不同 table 的外键。解决这个问题的最佳方法是什么?创建一个 M:M table Game_Pot? 我只需要记录每场比赛的 Pot,因为 Pots 会随着时间的推移而变化,我不想丢失这些数据。
抱歉这么久 post 并提前感谢大家 :)
我看到的唯一问题是 table Game
的定义:
FOREIGN KEY (universe_id, pot_name) REFERENCES Pot(universe_id, pot_name)
列的顺序很重要。 tablePot
的主键是(pot_name, universe_id)
,所以需要交换外键中的列,像这样:
FOREIGN KEY (pot_name, universe_id) REFERENCES Pot(pot_name, universe_id)
请注意,在每个 table 中具有 identity
(或 the-like)主键可能会简化您的设计:这将允许您减少子 [=] 中的列数24=]s,并使用 single-column 外键。同时,您仍然可以在具有唯一约束的父 table 中对列元组强制执行唯一性。