mysql - 将数据链接到数据库中的多个实体

标签 mysql sql database database-design foreign-keys

我正在设计一个数据库(此处已简化)来保存零件。每个部分都有自己唯一的 PartID。我们可以将零件存放在不同的容器中:

  • 环保袋
  • 盒子
  • 托盘

重要的是我们为每个容器提供特定的不同信息:

  • ID、 Material 类型、体积、 handle 类型
  • 盒子 ID、高度、宽度、长度
  • 托盘 ID、创建日期、使用次数、颜色

我的问题:将部件链接到这些多个容器实体的最佳方式是什么?

在我看来,概念上最简单的方法是在 Part 表中创建 ContainerType 和 ContainerID 列。我很犹豫是否要这样做,因为您实际上破坏了引用完整性,其中一列具有指向多个表的非强制外键,因为这是非法的。

我们可以制作一个包含容器所有可能属性的大容器表,但这看起来也很麻烦。

任何帮助或指导将不胜感激!!!

最佳答案

这是一个在 MySQL 中没有好的答案的问题。 有多种方法,每种方法各有利弊。

选项 #1 - 表中全是 NULL

正如评论中所建议的,containers 表将包含所有列,其中许多列为 NULL,因为它们与 3 种容器类型中的 2 种无关。 在 SELECTJOIN 中使用这样的表非常容易,但在这种情况下,数据库无法帮助您验证数据。您可以轻松地插入有一定长度的袋子或没有长度的盒子,而数据库无法强制执行。

选项 #2 - 将问题移至连接表

在这种方法中,您将问题从存储容器的表转移到存储零件位置的表。

有 3 个独立的容器表:

  • 袋子
  • 盒子
  • 托盘

还有一张用于将零件连接到容器的 table :

  • parts_to_containers

列:

  • part_id
  • 容器类型
  • 容器编号

如果您独立且经常处理容器库存,则此选项更好。它使您的容器工作变得非常容易,并将有问题的部分放在容器中放置零件的工作中。

您仍然可以编写一个包含 3 个 LEFT JOIN 的查询,它将为您提供有关每个部分的容器的信息。

还有一件事

如果您希望拥有更多类型的容器,那么以上任何一种容器都不容易扩展。如果添加了越来越多的容器类型,您可能需要一种完全不同的方法,其中所有公共(public)容器字段都在一个主containers表中,而所有其他容器attributes 位于 container_attributes 表中,其中包含 container_idattribute_nameattribute_value。其中一个属性是容器类型,其他属性是颜色、宽度、体积等。

对于具有随时间变化的各种不同属性的对象,这是一个非常灵活的模型。

关于mysql - 将数据链接到数据库中的多个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38723149/

相关文章:

java - servlet 无法保存到数据库

mysql - 如何从 NodeRed Mysql 节点获取输出

MySQL 触发 IF 条件

mysql - 如何让MySQL在grails 2.0上运行

处理标记系统和收藏夹的 Mysql 查询

mysql - 找不到参数 c : anorm. Column [Float] 的隐式值

sql - MySQL - 选择计数(*),分组依据,但保持分离

java - JSP Spring eval 是 parse int (为什么不解析 long)

php - SQL 将表键与 Group_Concat 分开

php - 如何编辑 MySQL 数据库中的记录