我可以使用同一个表中的2个外键构建MySQL DB表吗?

时间:2013-04-29 14:46:39

标签: php mysql sql database foreign-keys

无法绕着正确的方式缠绕我的头部......

我正在构建一个具有评判功能的活动管理应用程序。将有多轮,每轮有多名评委和多名参与者。任何给定的法官可以多轮判断,任何特定参与者可以参加多轮比赛。但是从每轮比赛中,每位参赛者每位裁判只会得一分。

我创建了以下表格:

 - 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个键来定义判断和参与者。我这样做是不是有问题?我最初会有单独的法官和参与者表,但我认为我目前的结构更符合“正确的方式”。还有什么我没想到的?

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)
);

完全无效。一个字段不能同时对两个不同的表“外来”。