【问题标题】:SQL one-to-many relationship: Should I see a "many" field in the table?SQL 一对多关系:我应该在表中看到“多”字段吗?
【发布时间】:2020-10-21 20:28:32
【问题描述】:

这是让我发疯的基本内容:

例如,如果我有一张桌子“团队”和一张桌子“玩家”。

并且团队可以有多个玩家以一对多的关系。

是否应该在团队表中的专用字段中表示?我的意思是,团队表中应该有一个“玩家”列吗?

或者链接两个表的外键的定义是否足够?

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

谢谢!

【问题讨论】:

  • 如果一个玩家只能参加一个团队,那你的设计就好了。
  • 表格有,而不是字段。
  • 语义。记录有字段。表有列。同意,设计很好,除非可以将一名球员换到另一支球队并且你关心这段历史,在这种情况下,这是一个多对多的关系,需要第三个“连接”表。

标签: sql postgresql database-design


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-27
    • 2022-11-25
    • 1970-01-01
    • 2012-12-01
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多