我正在设计一个数据库(此处已简化)来保存零件。每个部分都有自己唯一的 PartID。我们可以将零件存放在不同的容器中:
- 环保袋
- 盒子
- 托盘
重要的是我们为每个容器提供特定的不同信息:
- 包 ID、 Material 类型、体积、 handle 类型
- 盒子 ID、高度、宽度、长度
- 托盘 ID、创建日期、使用次数、颜色
我的问题:将部件链接到这些多个容器实体的最佳方式是什么?
在我看来,概念上最简单的方法是在 Part 表中创建 ContainerType 和 ContainerID 列。我很犹豫是否要这样做,因为您实际上破坏了引用完整性,其中一列具有指向多个表的非强制外键,因为这是非法的。
我们可以制作一个包含容器所有可能属性的大容器表,但这看起来也很麻烦。
任何帮助或指导将不胜感激!!!
最佳答案
这是一个在 MySQL 中没有好的答案的问题。 有多种方法,每种方法各有利弊。
选项 #1 - 表中全是 NULL
正如评论中所建议的,containers
表将包含所有列,其中许多列为 NULL,因为它们与 3 种容器类型中的 2 种无关。
在 SELECT
和 JOIN
中使用这样的表非常容易,但在这种情况下,数据库无法帮助您验证数据。您可以轻松地插入有一定长度的袋子或没有长度的盒子,而数据库无法强制执行。
选项 #2 - 将问题移至连接表
在这种方法中,您将问题从存储容器的表转移到存储零件位置的表。
有 3 个独立的容器表:
- 袋子
- 盒子
- 托盘
还有一张用于将零件连接到容器的 table :
- parts_to_containers
列:
- part_id
- 容器类型
- 容器编号
如果您独立且经常处理容器库存,则此选项更好。它使您的容器工作变得非常容易,并将有问题的部分放在容器中放置零件的工作中。
您仍然可以编写一个包含 3 个 LEFT JOIN
的查询,它将为您提供有关每个部分的容器的信息。
还有一件事
如果您希望拥有更多类型的容器,那么以上任何一种容器都不容易扩展。如果添加了越来越多的容器类型,您可能需要一种完全不同的方法,其中所有公共(public)容器字段都在一个主containers
表中,而所有其他容器attributes 位于 container_attributes
表中,其中包含 container_id
、attribute_name
和 attribute_value
。其中一个属性是容器类型,其他属性是颜色、宽度、体积等。
对于具有随时间变化的各种不同属性的对象,这是一个非常灵活的模型。
关于mysql - 将数据链接到数据库中的多个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38723149/