我们正在建立一个网络数据库系统,我们需要允许某些产品由其他产品制成。例如,将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
表,并且交叉引用表将是products
到base products
。不利的是,现在有三个表,而不是两个表。但是,由于灵活性的提高,我喜欢使用更多列且列较少的表。即使表任务不是完全不同的,让每个表完全专门化也可以使事情变得容易得多。
有很多方法可以解决,但是最佳情况是不需要数据重复和没有NULL值的方法。在不费吹灰之力的情况下,请尽量避免将NULL值保留在索引列中,并确保名称值仅出现在一个位置。
关于mysql - “产品可以由许多产品组成”的数据库结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23589505/