postgresql - 将关系“类型”添加到 SQL 中的多对多表是不好的做法吗?
问题描述
我正在构建一个具有以下两个表的 Postgres 数据库:
项目(id、startDate 等)和员工(id、姓名等)
我想跟踪员工为项目添加的贡献类型。例如,员工 #1 可能是项目 1 的“工程师”和项目 2 的“经理”。我也不想限制员工可以对某个项目做出贡献的数量。因此,员工#1 可以同时是单个项目的“工程师”和“经理”。
我的第一直觉是在两个名为 ProjectEmployees 或其他东西之间建立多对多关系,并将 projectId、employeeId 和 contributionType 存储为一个字符串,该字符串仅采用枚举中的值,而不必处理拼写错误或任何相关问题。
我的主要问题是这是否是一种不好的做法。我的另一个想法是将每种贡献类型拆分到自己的表格中。因此,不会有 EmployeeProjects 表,而是会有 ProjectEngineers、ProjectManagers 等表......并且不会将contributionType 存储为列,而是隐含在我正在使用的表中,并且该表只需存储项目 ID 和员工 ID。该数据库中有更多表具有类似的关系,其中不同表之间存在多对多关系,但每个关系都可能是许多“类型”关系中的一种。将这些全部拆分为每种关系类型的单独表是否更明智?还是像我的第一个想法那样在更通用的表中跟踪关系类型更好?
我想要的结果是能够有效地查看员工从事的所有项目贡献(和类型)以及查看项目的所有贡献者+贡献者类型。
解决方案
在您的第一个想法中使用多对多关系,我认为这是一个很好的做法。
避免为每种贡献类型创建一个表,因为它不可扩展且不灵活。IE 如果有一天你会有一种新的贡献类型,那么你每次都需要第二个选项
- 创建一个新表
- 编写新的表管理逻辑
- 继续新部署你的软件
关于将贡献类型存储在表上(带有 id 和描述)或作为具有枚举贡献类型字符串的约束的主题,我认为两者都是有价值的解决方案。
但是如果你想在你的软件中管理贡献类型(在第一个版本中或将来),也许有一个贡献类型的表格会更好。这取决于您的设计和要求
推荐阅读
- c++ - 获取 C++ 中矩阵的所有可能组合
- sql - sql查询中带有字符串的比较运算符
- python - Python 应用程序在通过 pip 安装时有效,但在直接运行时无效
- python - 在显示中使用 2D 掩码错误掩码 BGR 图像
- java - 如何使用 Class.getMethod 作为吸气剂?
- javascript - 当用户离开某些网页时如何触发事件?
- json - 如何使用 JOLT 转换复杂的 JSON 嵌套数组?
- java - 如何在两个实体(不相关的实体)之间使用 Hibernate 进行连接
- scala - 对代码在 ScalaTest 中无异常运行的单元测试
- docker - Web 应用程序未通过 Docker 容器运行