postgresql 如何用多对一关系建模3个表?

cwtwac6a  于 2023-06-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(136)

公司:
| 公司名称| Company Name |
| - -----| ------------ |
| 谷歌| Google |
| Facebook| Facebook |
参赛队伍:
| 团队名称| Team Name |
| - -----| ------------ |
| 视频性能| Video Performance |
| 存储优化| Storage Optimization |
员工:
| 员工姓名| Employee Name |
| - -----| ------------ |
| 约翰·史密斯| John Smith |
| 特蕾西·Json| Tracy Johnson |
存在以下关系:

  • EmployeesCompanies之间的多对一关系。
  • TeamsCompanies之间的多对一关系。
  • EmployeesTeams之间的多对一关系。

这些表将被连接,以便员工(以及他们所属的团队和公司)的所有信息可以与引用其ID的另一个表连接。在PostgreSQL中设计这种模式的最佳方式是什么?
我的团队在不同的设计之间来回穿梭:
1.直接在表中使用外键(员工对公司和团队有fk,团队对公司有fk)。
1.有一个表示员工关系的中间表来存储所有三个表的主键。
1.每个关系(员工-公司关系、团队-公司关系和员工-团队关系)都有一个中间表。
随着应用需求的增长,其中哪一个是最可持续的?

eqqqjvef

eqqqjvef1#

这里的重点是“多对一”。通常情况下,你会在许多表中放置一个外键,因为只有一种可能性。
所以你会有:

Company
    companyid, PK
    
Team
    teamid, PK
    companyid, FK, Company.companyid
    
Employee
    employeeid, PK
    companyid, FK, Company.companyid
    teamid, FK, Team.teamid

但这带来了一个潜在的问题。即使team 1不在company 1中,一个员工是否可能同时在team 1和company 1中?
我的意思是:

Company
    1
    
Team
    1   NULL    <-- record "1 1" does not exist, team1 is NOT linked to company1
    
Employee
    1   1   1

从Employee表中,我们可以假设由于他在team 1和company 1中,因此team 1与company 1相关。
这只能通过检查您的“业务”逻辑来回答。如果不可能有这样的场景,那么您可以从Team中删除外键companyid,因为team 1-company 1中的员工意味着team 1链接到company 1。
这包括设计1。对于设计2和3,您不需要链接表,因为这是针对多对多关系的。我在这里提出的问题仍然适用。只有您-在您的业务范围内-可以在这里选择。

相关问题