首页 > 解决方案 > 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。)

谢谢!

标签: sqlpostgresqldatabase-design

解决方案


“队表里应该有一个‘球员’一栏吗?” 不!你想要你已经拥有的玩家表中的团队列。这基本上是说“一支球队可以有很多球员,但一名球员只能在一支球队中”。如果您随后将球员列放入团队中,那么您已经创建了 1:1。这就是说“一名球员只能在一支球队中,一支球队只能有一名球员”。
以上将是定义当前情况。但是一名球员是否可以同时效力于多支球队——尤其是随着时间的推移——并且你想保留这段历史:球员 A 现在在球队 C,但上赛季在球队 B。那么你有一个 M:M 并且需要第三张桌子( player_team) 有一个玩家列和一个团队列,以及一些定义何时有效/有效的指标 - 例如开始和结束日期。


推荐阅读