数据库设计问题 - 改变以适应新问题

Database Design Issue - Altering to accommodate new issue

我们的问题是设计一个数据库系统,在俱乐部注册球员参加体育运动,并在注册了一项运动的球队中参加比赛。球员应该能够在不被分配到球队的情况下参加一项运动。我不小心错过了这一点,现在我正在努力重新设计我当前的架构。有没有一种简单的方法可以使用我当前的设计来实现这一点?

create table IF NOT EXISTS sports (
    sport_id SERIAL,
    sport_name VARCHAR(50),
    PRIMARY KEY(sport_id)
    );

create table IF NOT EXISTS players (
    player_id SERIAL,
    player_name VARCHAR(50),
    player_phone VARCHAR(20),
    PRIMARY KEY(player_id)
    );

create table IF NOT EXISTS teams (
    team_name VARCHAR(50),
    sport_id int REFERENCES sports(sport_id),
    captain_id INT REFERENCES players(player_id),
    PRIMARY KEY (team_name, sport_id)
    );

create table IF NOT EXISTS has_players (
    team_name VARCHAR(50),
    sport_id int,
    player_id INT REFERENCES players(player_id),
    FOREIGN KEY (team_name, sport_id) 
        REFERENCES teams(team_name, sport_id),
    PRIMARY KEY(team_name, sport_id, player_id)
    );



create table IF NOT EXISTS time_slot (
    training_id SERIAL,
    training_day VARCHAR(9),
    training_time TIME,
    team_name VARCHAR(50),
    sport_id int,
    FOREIGN KEY (team_name, sport_id) 
        REFERENCES teams (team_name, sport_id),
    CONSTRAINT check_day CHECK (training_day ~* '(\W|^)Monday|Tuesday|Wednesday|Thursday|Friday|
    Saturday|Sunday(\W|$)'),
    PRIMARY KEY (training_id)
    );

按照您的模型构建方式,团队和运动之间只有 link,球员和运动之间没有 link。你总是可以很容易地添加一个额外的 table,并且可以说某个球员参加某项运动。

create table IF NOT EXISTS players_sports (
    player_id INT REFERENCES players(player_id),
    sport_id int REFERENCES sports(sport_id),
    PRIMARY KEY (player_id, sport_id)
    );

然后在团队中,你可以这样调整:

sport_id int REFERENCES sports(sport_id),
captain_id INT REFERENCES players(player_id),

对此:

sport_id int REFERENCES players_sports(sport_id),
captain_id INT REFERENCES players_sports(player_id),   

这实现了所有球队都有关联的运动,球员不必在一个球队,你可以加入球员队长信息,来自球队(虽然通过一个额外的table, players_sports)