【问题标题】:Is there anything wrong with having a table with one column? (MSSQL Server)一张只有一列的表格有什么问题吗? (SQL 服务器)
【发布时间】:2009-04-21 20:18:40
【问题描述】:

考虑以下场景:

表格:

  • 员工(EmpId(PK),姓名)
  • TeamMembers(TeamId(PK), EmpId(PK))
  • 项目(ProjId(PK), TeamId)

我真的想避免使用复合 PK,但我看到的唯一方法是创建一个只有 1 列 TeamId(PK) 的团队表(我不想存储与团队相关的任何信息,除了它的成员)(编辑:如果我创建一个团队表,我会将 TeamMeberId 添加到 TeamMembers 表并使其成为 PK)

当前设置的另一个问题是我无法在 Project 和 TeamMebers 表之间为 TeamId 设置关系

我应该只创建一个 1 列的团队表吗​​?在这种情况下,最好的方法是什么?

编辑

只是为了澄清一下,关于那个团队我唯一想知道的是它的存在,没有任何额外的信息

EDIT2

Tables 新设计(有什么问题吗?):

  • 员工(EmpId(PK),姓名)
  • 团队(TeamId(PK))
  • TeamMembers(TeamMemberId(PK)、TeamId(FK)、EmpId(FK))
  • 项目(ProjId(PK), TeamId(FK))

【问题讨论】:

  • 我仍然不清楚你为什么需要一个团队表。尤其是新结构。如果一个团队的存在只是为了分配给一个项目,那么就不需要跟踪它。
  • @Jeremy:如果没有 Team 表,您将如何在 ProjectTable 中的 TeamId 上建立 FK 关系?

标签: sql-server database-design


【解决方案1】:

如果团队的唯一有趣之处在于它的存在,那么只有一列的Team 表没有任何问题:TeamId。它确保了TeamMembersProject 表的引用完整性。

但我不明白你反对复合 PK。 TeamMembers 表中的 TeamIdEmpId 列已经是复合主键。

【讨论】:

  • 使用复合 PK,我无法在 Project 表中将 TeamId 设为 FK ...我可能做错了什么
  • 创建 Team 表,使用它来维护 Project 和 TeamMembers 表的引用完整性 (FK)。
  • 啊,我明白了。我会按照建议创建 Team 表。您是否想要将 TeamMemberId 添加到 TeamMembers 表中取决于您。我会选择不这样做,因为它会在您的数据库中添加不必要的额外数据。
【解决方案2】:

这种情况没有任何问题。我会做的。

另一方面,您可以在团队表中保存其他信息,例如团队名称或其他信息。

【讨论】:

    【解决方案3】:

    1 列的表没有任何问题。但是,您可能需要考虑您的 Team 表可能具有的其他属性。例如,团队名称?

    对于项目和员工的关系,你只需要通过 TeamMembers 表加入即可。

    【讨论】:

    • 如果我有其他信息要存储在 Team 表中,我不会在这里问这个问题 :)
    【解决方案4】:

    EmpId 真的需要成为 TeamMembers 表中的主键吗?你可以说每个团队都有很多员工,而且关系很好。

    【讨论】:

    • TeamMembers 表有一个 COMPOSITE PK,EmpId + TeamId
    【解决方案5】:

    既然 Project 和 TeamMembers 之间似乎存在一对一的关系(如果我错了,请纠正我),并且您不想存储有关团队的其他信息,这样不是更容易吗?摆脱 TeamMembers 表,使用 Project 和 Employee 之间的多对多链接表

    Employee (EmpId(PK), Name)
    EmployeeProjects(EmpId(PK), ProjId(PK))
    Project(ProjId(PK), <other project info>)
    

    但要回答您最初的问题。使用单列表并没有什么特别的问题。

    【讨论】:

    • 第二。如果没有关于团队的信息,它真的存在吗?在我看来,你正在创造一个没有实际价值的人造制品。使用此方案,您可以轻松创建所有从事项目的员工的列表,并列出员工正在从事的所有项目——有什么不值得喜欢的?
    【解决方案6】:

    这就是我构建表格的方式

    1. 员工(EmployeeId(PK),姓名)
    2. 团队(TeamID(PK))
    3. TeamMembers(TeamMembersID(PK), TeamId, EmployeeId)
    4. 项目(ProjectID(PK), TeamId)

    我喜欢将 PK 作为表名,以 ID 为后缀。
    这种约定确实有有时会创建看似冗余的主键(如 TeamMembersID)的副作用,但它解决了您的复合键问题。

    【讨论】:

    • 我的问题是“Team 表有什么问题吗(主要是它只有 1 列)?
    • @rm:我知道这一点。尽管我没有明确表示,但我假设您通过查看我构建表格的方式就知道我对您的问题的回答是“否”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2011-09-10
    相关资源
    最近更新 更多