注意事项(对照 sample 的出题口吻):Player 由 player_id 识别、Arbiter 由 arbiter_id 识别,这两个属性必须加进你的 UNF;每位棋手有姓名和等级组(A/B);轮号全局唯一;同一棋手每轮只下一场。写出 UNF → 1NF → 2NF → 3NF;1NF 起给主键加下划线;1NF 阶段列出全部候选键;用依赖图标注部分/传递依赖;不得新增属性。
📖 参考答案(先自己写完再展开)
UNF:
CHESS_ROUND (round_no, round_date,
(start_time, board_no, player1_id, player1_name, player1_class,
player2_id, player2_name, player2_class,
arbiter_id, arbiter_name, arbiter_level))
1NF:(拆重复组)
ROUND (round_no, round_date) PK: round_no
MATCH (round_no, board_no, start_time,
player1_id, player1_name, player1_class,
player2_id, player2_name, player2_class,
arbiter_id, arbiter_name, arbiter_level)
MATCH 的候选键(必须全部列出):
(round_no, board_no, start_time) — 一台一时一场
(round_no, player1_id) — 每人每轮只下一场
(round_no, player2_id)
选 PK: round_no + board_no + start_time(加下划线)
部分依赖: player1_id → player1_name, player1_class
player2_id → player2_name, player2_class
(依赖候选键 (round_no, playerX_id) 的一部分)
2NF:(去部分依赖)
PLAYER (player_id, player_name, player_class) PK: player_id
MATCH (round_no, board_no, start_time,
player1_id, player2_id,
arbiter_id, arbiter_name, arbiter_level)
传递依赖: arbiter_id → arbiter_name, arbiter_level(非键 → 非键)
3NF:(去传递依赖)
ROUND (round_no, round_date)
PLAYER (player_id, player_name, player_class)
ARBITER (arbiter_id, arbiter_name, arbiter_level)
MATCH (round_no, board_no, start_time,
player1_id, player2_id, arbiter_id)
完全依赖: round_no → round_date; player_id → player_name, player_class;
arbiter_id → arbiter_name, arbiter_level;
(round_no, board_no, start_time) → player1_id, player2_id, arbiter_id
自查点:player1/player2 是两个角色共用 PLAYER 一张表(两个 FK);round_date 在 1NF 拆重复组时就随 round_no 分离;两处 rating class 都只依赖各自 player_id——这正是部分依赖的教科书形态。