外键引用两个表

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 中对列元组强制执行唯一性。