无法绕着正确的方式缠绕我的头部......
我正在构建一个具有评判功能的活动管理应用程序。将有多轮,每轮有多名评委和多名参与者。任何给定的法官可以多轮判断,任何特定参与者可以参加多轮比赛。但是从每轮比赛中,每位参赛者每位裁判只会得一分。
我创建了以下表格:
- user
- user_id
- user_name
- user_role_id
- user_role
- user_role_id
- user_role_name
- user_role_desc
- round
- round_id
- round_name
- round_loc
- user_round (to join many-to-many users and rounds)
- user_id
- round_id
- score
- score_id
- score_value
- round_id
- user_id_judge
- user_id_participant
user_role定义了法官,参与者,管理员,支持等。然后我将所有用户放在一个表中并分配了一个角色 - 这让我感到困惑。当我定义分数时,这意味着我必须在用户表中包含2个键来定义判断和参与者。我这样做是不是有问题?我最初会有单独的法官和参与者表,但我认为我目前的结构更符合“正确的方式”。还有什么我没想到的?
答案 0 :(得分:1)
同一个表的多个外键是完全可以接受的。与任何外键关联一样,您只需要小心join
查询中的所有内容,因为在某些情况下,这会导致性能问题。
答案 1 :(得分:1)
您可以在表中拥有与字段一样多的外键。你不能拥有的是一个字段同时是两个不同表的外键。
你的'得分'表没有问题,判断和参与者字段都指向用户表。 e.g。
create table score (
judge_id int,
participant_id int,
foreign key (judge_id) references users (id),
foreign key (participant_id) references users (id)
);
是完全有效的SQL。您可能希望在客户端和/或数据库中添加一些逻辑来强制参与者不能成为他们自己的判断,但这是另一回事。
像
这样的东西create table broken (
fieldname int,
foreign key (fieldname) references table1 (id),
foreign key (fieldname) references othertable (id)
);
完全无效。一个字段不能同时对两个不同的表“外来”。