2016-08-02 84 views
1

我正在设计一个数据库(在这里简化)来存放零件。每个部分都有其独特的PartID。我们可以将部件储存在不同的容器:将数据链接到数据库中的多个实体

  • 环保袋
  • 托盘

重要的是,我们对每个容器的具体不同的信息:

  • 包: ID,材质类型,卷,手柄类型
  • 盒: ID,高度,宽度,长度
  • 托盘: ID,dateCreated会,NumberOfTimesUsed,颜色

我的问题:什么是零件链接到的最好办法这些多个容器实体?

在我看来,最简单的方法是在Part表中创建ContainerType和ContainerID列。我很犹豫,因为你基本上违反了具有非强制外键的列到多个表的参照完整性,因为它是非法的。

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

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

+0

个人而言,我会创建一个'container'表中的列'ID,ContainerType,MaterialType,音量,HandleType,高度,宽度,长度,dateCreated会,NumberOfTimesUsed,'和'Color'。你必须一吨NULL值的,但它将使加盟这么容易,你才能避免部分表重复了大量的数据。你只需加入一个身份证号码。 –

回答

1

这是一个在MySQL中没有很好答案的问题。有几种方法,每种方法都有优点和缺点。

选项#1 - 满桌子的空值

正如评论所说,一个containers表中,将有所有列,其中不乏NULL,因为他们将不相关的3容器2类型。 在SELECTJOIN中使用这样的表格非常容易,但在这种情况下,数据库无法帮助您验证数据。您可以轻松地插入长度不足的包或没有包的包,并且数据库无法执行。

选项#2 - 移动问题的连接表

在这种方法中,你是从储存容器,该储存部件位置的表的表移动的问题。

有3个独立的容器表:

  • 托盘

而对于部分连接到容器的一个表:

  • parts_to_containers

与列:

  • PART_ID
  • CONTAINER_TYPE
  • CONTAINER_ID

此选项是更好,如果你独立,经常处理集装箱的库存。它与集装箱你的工作很轻松,并把与部件的集装箱安置工作问题的一部分。

您仍然可以写3个LEFT JOIN s表示将让你对每个零件的集装箱信息的查询。

一件事

如果你希望有更多类型的容器,没有以上将是易于扩展。如果再加上越来越多的容器类型,你可能需要一个完全不同的方法,所有共同容器字段是一个主containers表,和所有其他容器属性处于container_attributescontainer_idattribute_nameattribute_value。一属性将是容器类型,其他人将颜色,宽度,体积等

这是为与各种随时间变化的不同attrobutes的对象非常灵活的模型。

+0

你不应该感谢的人的意见,但我还是要去这样做,因为这个答案是伟大的。谢谢。 – user1904766

0

表中一对多关系的经验法则是:关系单边的主键充当关系多方的外键,以保持参照完整性。

创建一个名为containers的表,主键列为containerid等栏目,如containernamecontainercreatedOncontainerlastOpenedOn。主键container。来自表containerid作为名为parts的外键列添加到您的零件表中。 container_id

+0

Yikes!也许我应该指定更好,但这是一对多的关系。许多零件可以放在一个容器中,而我只有一个零件表。 – user1904766