【问题标题】:How do I handle many NULL-able foreign keys in Postgres?如何在 Postgres 中处理许多可以为 NULL 的外键?
【发布时间】:2015-12-09 10:13:16
【问题描述】:

我希望制作一个指向航班表的路线表。

但是,每条路线最多可以有 25 个航班,我希望每个航班都是外键。

这样做表好像很浪费:

CREATE TABLE routes (
id SERIAL PRIMARY KEY,                                                                              
flight1 INT references "flights" (id),
flight2 INT references "flights" (id),
...
flight24 INT references "flights" (id),
flight25 INT references "flights" (id),
rating INT NOT NULL
);

因为,航班的平均数量应该在 8 左右。我将用 NULL 填充空航班。所以平均路由将包含 17 个 NULL。

这是正确的方法吗?我查看了任意长度的外键数组,但 psql (9.3.10) 似乎不支持这些外键

【问题讨论】:

  • 您可能需要一个额外的表(“联结表”)来将路线与航班关联起来。
  • 该联结表是否还有 25 个航班 ID 列?或者,路由表会指向联结表 25 次吗?
  • 不,每条路线将变为 25 行(或更少)。
  • 知道了。所以要查询路线 1 中的所有航班,只需 SELECT flightid FROM rfjunction WHERE routeid = 1 ?然后从这些航班 ID 中选择所有信息?
  • 阅读规范化

标签: sql postgresql create-table


【解决方案1】:

这不是正确的方法。你需要一张额外的桌子。所以,是这样的:

CREATE TABLE routes (
    RouteId SERIAL PRIMARY KEY,
    Rating int not null
);

CREATE TABLE RouteFlights (
    RouteFlightId serial primary key,
    RouteId int not null references Routes(RouteId),
    Flight int not null references Flights(FlightId)
);

【讨论】:

  • RouteFlightId 也可能不需要,因为 RouteId 和 Flight 在这种简单的情况下可以用作主键,但这也是首选。
猜你喜欢
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2020-04-16
  • 1970-01-01
  • 2014-09-17
  • 1970-01-01
相关资源
最近更新 更多