将关系 "type" 添加到 SQL 中的多对多 table 是不好的做法吗?
Is it bad practice to add a relation "type" to a many to many table in SQL?
我正在构建一个具有以下两个 table 的 Postgres 数据库:
项目(id、开始日期等...)
和
员工(身份证、姓名等...)
我想跟踪员工添加到项目中的贡献类型。例如,员工 #1 可能是项目 1 的“工程师”和项目 2 的“经理”。我也不想限制员工对某个项目的贡献数量。因此,员工 #1 可以同时是单个项目的“工程师”和“经理”。
我的第一直觉只是在两个标题为 ProjectEmployees 或其他东西之间建立多对多关系,并将 projectId、employeeId 和 contributionType 存储为字符串,它只会从枚举中获取值而不是处理拼写错误或任何相关问题。
我的主要问题是这是否是一种不好的做法。我的另一个想法是将每种贡献类型拆分为自己的 table。因此,不是 EmployeeProjects table,而是 tables,例如 ProjectEngineers、ProjectManagers 等......而不是将 contributionType 存储为列,它将隐含在 table 我正在使用, table 只需要存储 projectId 和 employeeId。此数据库中还有更多 tables,它们具有类似的关系,其中不同的 tables 之间存在许多对多的关系,但每个关系都可以是许多“类型”关系中的一种。对于每种类型的关系,将这些全部拆分为单独的 table 是否更明智?还是像我的第一个想法那样以更一般的方式跟踪关系类型更好 table?
我想要的结果是能够有效地查看员工从事的所有项目贡献(和类型),以及查看项目的所有贡献者 + 贡献者类型。
创建一个 table 以将贡献类型存储为字符串(经理、工程师等)和贡献类型 ID(数字 ID)。这样可以防止拼写错误。
创建一个 table 来存储包含以下列的贡献:员工 ID、项目 ID、贡献类型 ID(您可能需要其他列,但它在这 3 列的组合上应该是唯一的)。不要像这样将贡献类型存储为 table 中的字符串,因为正如您正确提到的那样,这可能会导致拼写错误。另一个原因是为了节省磁盘space。具有少量 table 贡献类型的额外加入是一个很小的代价。
按照您的第一个想法使用多对多关系,我认为这是一个很好的做法。
避免为每个贡献类型创建一个 table,因为它不可扩展且不灵活。 IE。如果有一天你会有一个新的贡献类型,你每次都需要第二个选项
- 创建一个新的table
- 编写新的table管理逻辑
- 继续部署您的 sw
关于将贡献类型存储在 table 上(带有 id 和描述)或作为带有枚举的贡献类型字符串的约束的主题,在我看来这两个都是有价值的解决方案。
但是,如果您想要管理软件中的贡献类型(在第一个版本中或将来),也许 table 具有贡献类型的字谜会更好。这取决于您的设计和要求
我正在构建一个具有以下两个 table 的 Postgres 数据库:
项目(id、开始日期等...) 和 员工(身份证、姓名等...)
我想跟踪员工添加到项目中的贡献类型。例如,员工 #1 可能是项目 1 的“工程师”和项目 2 的“经理”。我也不想限制员工对某个项目的贡献数量。因此,员工 #1 可以同时是单个项目的“工程师”和“经理”。
我的第一直觉只是在两个标题为 ProjectEmployees 或其他东西之间建立多对多关系,并将 projectId、employeeId 和 contributionType 存储为字符串,它只会从枚举中获取值而不是处理拼写错误或任何相关问题。
我的主要问题是这是否是一种不好的做法。我的另一个想法是将每种贡献类型拆分为自己的 table。因此,不是 EmployeeProjects table,而是 tables,例如 ProjectEngineers、ProjectManagers 等......而不是将 contributionType 存储为列,它将隐含在 table 我正在使用, table 只需要存储 projectId 和 employeeId。此数据库中还有更多 tables,它们具有类似的关系,其中不同的 tables 之间存在许多对多的关系,但每个关系都可以是许多“类型”关系中的一种。对于每种类型的关系,将这些全部拆分为单独的 table 是否更明智?还是像我的第一个想法那样以更一般的方式跟踪关系类型更好 table?
我想要的结果是能够有效地查看员工从事的所有项目贡献(和类型),以及查看项目的所有贡献者 + 贡献者类型。
创建一个 table 以将贡献类型存储为字符串(经理、工程师等)和贡献类型 ID(数字 ID)。这样可以防止拼写错误。
创建一个 table 来存储包含以下列的贡献:员工 ID、项目 ID、贡献类型 ID(您可能需要其他列,但它在这 3 列的组合上应该是唯一的)。不要像这样将贡献类型存储为 table 中的字符串,因为正如您正确提到的那样,这可能会导致拼写错误。另一个原因是为了节省磁盘space。具有少量 table 贡献类型的额外加入是一个很小的代价。
按照您的第一个想法使用多对多关系,我认为这是一个很好的做法。
避免为每个贡献类型创建一个 table,因为它不可扩展且不灵活。 IE。如果有一天你会有一个新的贡献类型,你每次都需要第二个选项
- 创建一个新的table
- 编写新的table管理逻辑
- 继续部署您的 sw
关于将贡献类型存储在 table 上(带有 id 和描述)或作为带有枚举的贡献类型字符串的约束的主题,在我看来这两个都是有价值的解决方案。
但是,如果您想要管理软件中的贡献类型(在第一个版本中或将来),也许 table 具有贡献类型的字谜会更好。这取决于您的设计和要求