Postgresql - 复合键和两个 table,还是只有 1 个宽 table?

Postgresql - Composite Key and two tables, or just 1 wide table?

我正在构建一个赛马数据库,但我正在努力寻找最佳设计。

选项 1)

2 Tables,1 个代表“种族”,另一个代表“马匹”

这看起来像这样

Table 1: 身份证 |日期 |时间 |种族名称 |工作日 |课程 |距离 |去 | Class |价格|启动器数量 |完成时间 |种族类型

Table 2:

比赛编号 |完成编号 1 |马名|骑师 |培训师 |重量 |年龄 |截面速度 | 等等 比赛编号 |完成第 2 名 | .....

此设计的问题:如何在日期、时间、课程和比赛名称上定义复合主键并将其作为外键链接到 [=56] 中的比赛 ID =] 2?我使用 Postgresql (via.pgadmin4)

选项 2:

一宽 table,有比赛数据,然后马匹排成一排(完成编号 1 | 2 | 3 .... 在极少数情况下直到 30)

此设计的问题在于并非每场比赛都有相同数量的首发,因此从 8 号马到 30 号马的行中会有很多 null 条目。

优点是,我不必加入 table 进行查询,大多数查询都需要完整的联接,因为每个 table 中的几乎所有数据都需要查询。

table 将包含大约 360-400 列(宽)和最多 20.000(可能更多)行。

问题:这会是性能方面的问题吗?我一天只会查询几次

非常感谢

广泛的 table 是数据仓库方法。这在处理数十亿行时可能是合适的。但是数据仓库往往从纯关系型数据库中获取数据,所以保证了数据的一致性。

联接是 RDBMS 的用途。他们通常很快。别担心这个。我的建议是:建立一个合适的规范化数据库。

有赛马有马。一场比赛有多匹马,一匹马可以参加多场比赛。这是一个 m:n 关系,您需要一个桥梁 table。

table组:

  • 马(horse_id、horse_name、birth_date、驯马师、...)
  • 种族(race_id、date_time、race_name、路线、距离、price_money、...)
  • 参与(horse_id、race_id、骑师、重量、位置、...)