我正在尝试创建一个关系数据库来模拟格斗运动信息——两个对手之间的比赛,每个对手有三名裁判和一名裁判员。 我有一些表存储每个实体的信息:参与者、法官和裁判员。 我还有一张模拟比赛本身的表格。
如何管理这些表之间的关系,参赛者可以参加多个比赛,评委可以评判多个比赛,裁判可以裁判多个比赛?
这是我正在尝试做的一个最小的例子。
这是 dbml:
Table Contest{
contest_id[pk, increment]
participant_1_id int [ref: > Partcipant.participant_id ]
participant_2_id int [ref: > Partcipant.participant_id ]
}
Table Participant{
participant_id[pk, increment]
participant_wins int
participant_losses int
participant_draws int
}
这是为 PostgreSQL 生成的 SQL:
CREATE TABLE "Contest" (
"contest_id" INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
"participant_1_id" int,
"participant_2_id" int
);
CREATE TABLE "Participant" (
"participant_id" INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
"participant_wins" int,
"participant_losses" int,
"participant_draws" int
);
ALTER TABLE "Contest" ADD FOREIGN KEY ("participant_1_id") REFERENCES "Participant" ("participant_id");
ALTER TABLE "Contest" ADD FOREIGN KEY ("participant_2_id") REFERENCES "Participant" ("participant_id");
以下是我收到的错误消息:
CREATE TABLE "Contest" (
"contest_id" INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
"participant_1_id" int,
"participant_2_id" int
);
psql:database/db.sql:5: ERROR: relation "Contest" already exists
CREATE TABLE "Participant" (
"participant_id" INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
"participant_wins" int,
"participant_losses" int,
"participant_draws" int
);
psql:database/db.sql:12: ERROR: relation "Participant" already exists
ALTER TABLE "Contest" ADD FOREIGN KEY ("participant_1_id") REFERENCES "Participant" ("participant_id");
psql:database/db.sql:14: ERROR: column "participant_1_id" referenced in foreign key constraint does not exist
ALTER TABLE "Contest" ADD FOREIGN KEY ("participant_2_id") REFERENCES "Participant" ("participant_id");
psql:database/db.sql:16: ERROR: column "participant_2_id" referenced in foreign key constraint does not exist
您的 SQL 代码看起来没问题。但是,当再次执行 CREATE TABLE ... 时(当表已存在时),我们会收到错误消息(请参阅示例 dbfiddle.uk/x3ato0zc )。解决方案:在 CREATE TABLE 语句之前将每个表的 DROP TABLE ... 写入脚本中。 (注意:避免在实时数据库上使用删除表。)
建模:如果一场比赛只有一名评委和一名裁判,那么您正在处理一对多关系(因为每个评委/裁判可以与多个比赛相关联)。由于竞赛有 2 名参与者,因此在本例中我们正在考虑多对多关系(竞赛 <-> 参与者)。这看起来很奇怪,但是您的模型将需要比赛和参与者之间的“桥接表”或“交集”。骨架示例请参见https://dbfiddle.uk/v7iLzL4R