在关系数据库中对一个实体与多个其他实体的多种关系进行建模

问题描述 投票:0回答:1

我正在尝试创建一个关系数据库来模拟格斗运动信息——两个对手之间的比赛,每个对手有三名裁判和一名裁判员。 我有一些表存储每个实体的信息:参与者、法官和裁判员。 我还有一张模拟比赛本身的表格。

如何管理这些表之间的关系,参赛者可以参加多个比赛,评委可以评判多个比赛,裁判可以裁判多个比赛?

这是我正在尝试做的一个最小的例子。

这是 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 database relational-database
1个回答
0
投票

您的 SQL 代码看起来没问题。但是,当再次执行 CREATE TABLE ... 时(当表已存在时),我们会收到错误消息(请参阅示例 dbfiddle.uk/x3ato0zc )。解决方案:在 CREATE TABLE 语句之前将每个表的 DROP TABLE ... 写入脚本中。 (注意:避免在实时数据库上使用删除表。)

建模:如果一场比赛只有一名评委和一名裁判,那么您正在处理一对多关系(因为每个评委/裁判可以与多个比赛相关联)。由于竞赛有 2 名参与者,因此在本例中我们正在考虑多对多关系(竞赛 <-> 参与者)。这看起来很奇怪,但是您的模型将需要比赛和参与者之间的“桥接表”或“交集”。骨架示例请参见https://dbfiddle.uk/v7iLzL4R

© www.soinside.com 2019 - 2024. All rights reserved.