我们正在建立一个网络数据库系统,我们需要允许某些产品由其他产品制成。例如,将2个或更多产品组合为新产品。我们正在使用CakePhp和MySQL。

这是我们数据库的数据结构图:
https://www.dropbox.com/s/ksv22rt45uv69k9/Data%20Structure%20Diagram.png

我们需要自引用产品表还是创建新表?

最佳答案

您都可以。两者都有优点和缺点。无论哪种方式,您都需要一个交叉引用表。

交叉引用表可以引用自身。

项目中的产品

+---------------------+----------------------------+------------+
| product_identifier  |   product_identifier_child |   quantity |
+---------------------+----------------------------+------------+
|          1          |              1             |    1       |
|          2          |              1             |    1       |
|          2          |              2             |    2       |
|          3          |              2             |    1       |
+---------------------+----------------------------+------------+


从好的方面来说,此方法意味着您只有一个数据表和一个新的交叉引用表,并且可以根据需要添加新产品(以及多个相同的产品,例如,带有礼品篮)。不利的一面是,您的桌子将试图同时做两种不同的事情。其中包含其他产品的产品可能没有model number。另外,您将如何确定是否检查inventory表?您将要为由产品制成的产品提供inventory,还是要尽快检查单个产品的库存以查看组合产品是否有库存?后者更加灵活,您仍然可以通过这种方式保留库存。它仅允许您的所有库存在库存表中处于相同的单位比例。

为了增加灵活性,您可以创建另一个表base products,该表具有仅构建模块产品具有的值。

基础产品

+--------------------------+----------+--------------+
|  base product identifier |  brand   | model number |
+--------------------------+----------+--------------+


然后,您可以将库存附加到base products表,并且交叉引用表将是productsbase products

不利的是,现在有三个表,而不是两个表。但是,由于灵活性的提高,我喜欢使用更多列且列较少的表。即使表任务不是完全不同的,让每个表完全专门化也可以使事情变得容易得多。

有很多方法可以解决,但是最佳情况是不需要数据重复和没有NULL值的方法。在不费吹灰之力的情况下,请尽量避免将NULL值保留在索引列中,并确保名称值仅出现在一个位置。

关于mysql - “产品可以由许多产品组成”的数据库结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23589505/

10-13 08:52
查看更多