我们正在构建一个Web数据库系统,我们需要允许某些产品由其他产品构成。例如,将2个或更多产品组合为新产品。我们正在使用CakePhp和MySQL。
这是我们数据库的数据结构图: https://www.dropbox.com/s/ksv22rt45uv69k9/Data%20Structure%20Diagram.png
我们是否需要自我引用产品表或创建新表?
答案 0 :(得分:1)
你可以做任何一件事。这两者都有利有弊。无论哪种方式,您都需要一个交叉引用表。
交叉引用表可以自行引用。
项目中的+---------------------+----------------------------+------------+
| 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 值保留在索引列之外,并确保您的名称值仅显示在一个位置。