问题描述
我目前正在使用数据库,但是遇到了一个新问题。涉及的实体是宇宙,竞争,游戏,底池。这是创建表的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,edition),pot_name) REFERENCES Pot(universe_id,pot_name)
);
问题从最后一张桌子开始(游戏),因为我不能将Universe_id用作不同桌子的外键。解决此问题的最佳方法是什么?创建M:M表Game_Pot? 我只需要记录每场比赛的底池,因为底池会随着时间的变化而变化,我不想丢失这些数据。
很长的帖子,很抱歉,谢谢大家:)
解决方法
我看到的唯一问题是表Game
的定义:
FOREIGN KEY (universe_id,pot_name) REFERENCES Pot(universe_id,pot_name)
列的顺序很重要。表Pot
的主键是(pot_name,universe_id)
,因此您需要交换外键中的列,如下所示:
FOREIGN KEY (pot_name,universe_id) REFERENCES Pot(pot_name,universe_id)
请注意,在每个表中都有identity
(或类似主键)可能会简化您的设计:这将允许您减少子表中的列数,并使用单列外键。同时,您仍然可以对具有唯一约束的父表中的列元组强制执行唯一性。