sql - SQL 一对多关系:我应该在表中看到“多”字段吗?
问题描述
这是让我发疯的基本内容:
例如,如果我有一个表“团队”和一个表“玩家”。
并且球队可以有多名球员处于一对多的关系中。
这是否应该在团队表中的专用字段中表示?我的意思是,球队表中应该有一个“球员”列吗?
或者链接两个表的外键的定义是否足够?
CREATE TABLE team (
id serial,
name VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE player (
id serial,
team_id int NOT NULL,
name VARCHAR(100) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (team_id) REFERENCES team(id)
);
我将非常感谢您的简短解释。(如果这很重要,我会使用 PostgreSQL。)
谢谢!
解决方案
“队表里应该有一个‘球员’一栏吗?” 不!你想要你已经拥有的玩家表中的团队列。这基本上是说“一支球队可以有很多球员,但一名球员只能在一支球队中”。如果您随后将球员列放入团队中,那么您已经创建了 1:1。这就是说“一名球员只能在一支球队中,一支球队只能有一名球员”。
以上将是定义当前情况。但是一名球员是否可以同时效力于多支球队——尤其是随着时间的推移——并且你想保留这段历史:球员 A 现在在球队 C,但上赛季在球队 B。那么你有一个 M:M 并且需要第三张桌子( player_team) 有一个玩家列和一个团队列,以及一些定义何时有效/有效的指标 - 例如开始和结束日期。
推荐阅读
- flutter - 如何在 Flutter 中正确实现自定义字体?
- unity3d - 有没有办法让实例化的文本跟随游戏对象?
- postgresql - Gorm 一对一关系 2 个外键引用单向模型?
- javascript - 背景颜色没有通过使用 JS 更新 CSS 变量来更新
- sql - 在 oracle sql developer 中计算总计
- sql-server - SQL Server:如何制作一个包含不在另一个表中的日期和设施的列表?
- ruby-on-rails - 找不到生成器“序列化器”
- docker - 如何将 GitLab CI 文件变量传递给 docker 容器?
- google-apps-script - 打开现有的谷歌电子表格进行查看
- angular - mat-selection-list 不适用于 *ngFor