我需要一个关于如何设计可靠高效的SQL数据库来存储多级数据数组的新视角。
这个问题适用于很多情况,但我想出了这个例子:
有数百种产品。每种产品都有不确定数量的零件。每个部分都是由几个元素构成的。
所有产品都以相同的方式描述。所有零件都需要相同的字段来描述它们(比方说:价格,重量,零件名称),所有零件的所有元素也都有统一的设计(例如:元素代码,制造商)。简单明了。
一个元素可以仅与部分相关,并且每个部分仅与一个产品相关。
我想出了三张桌子的想法:
Products:
--------------------------------------------
prod_id prod_name prod_price prod_desc
1 hoover 120 unused
下
Parts:
----------------------------------------------------
part_id part_name part_price part_weight prod_id
3 engine 10 20 1
最后
Elements:
---------------------------------------
el_id el_code el_manufacturer part_id
1 BFG12 GE 3
现在,选择一个所需的产品,从prod_id相同的PARTS中选择所有产品,然后从partments匹配的ELEMENTS中选择所有产品 - 在多次查询后,您已获得所有数据。
我只是不确定这是否是正确的做法
我还有另一个想法,没有ELEMENTS表
这会减少查询,但我有点害怕它可能是蹩脚和不好的做法
PARTS表中还有两个字段,而不是ELEMENTS表,所以它看起来像这样:
part_id,part_name,part_price,part_weight,prod_id, part_el_code,part_el_manufacturer
它们将是 text 类型,对于每个部分,有关元素的信息将以字符串形式存储,这样:
part_el_code | code_of_element1; code_of_element2; code_of_element3
part_el_manufacturer | manuf_of_element1; manuf_of_element2; manuf_of_element3
然后我们所需要的就是从那些字段中爆炸()数据,我们得到数组,易于显示。 当然这不是完美的并且有一些限制,但这个想法可以吗?
我提出第二个变体的原因是第三个表 - 元素 - 最终会变得非常大。如果有10,000个产品,每个产品有4个零件,平均每个零件有3个元件 - 这意味着Elements表中必须有120,000个行。说实话 - 我真的不知道这是否会导致性能问题。
我应该第一个想法吗?或者也许有更好的方法解决这个问题?
答案 0 :(得分:2)
描述事物之间的关系正是关系数据库所做的事情。任何关于SQL的书都应该提供很多例子,我建议你找一本书来更好地理解这些问题,但我会快速回答你的问题。
您正在使用3个表的简单解决方案,但您不需要三个select语句。这就是join
的用途。在您的示例中,以下select语句将为您提供特定产品的所有数据。
select *
from product
join parts on parts.prod_id = product.prod_id
join elements on elements.part_id = part.parts_id
where product.prod_id = x
这很好,可以完全满足您的需求。
就你的第二个想法而言,它真的很糟糕。您正在使用关系数据库,它允许您存储数据集并将其关联。将列表存储在字符串值中是为了忽略关系数据库设计好的确切功能。
但是,有一种方法可以改善您的设计。我认为你可能并不总是对产品和零件或零件和元素有一对一的关系。所以我建议如下。
首先从parts表中删除prod_id,然后从elements表中删除part_id。
然后创建两个“连接表”。让我们称它为prodparts和partselement。它们看起来像这样:
prodparts would contain two columns prod_id and part_id (and maybe a count?)
partselement would contain two columns part_id and el_id (and maybe a count?)
现在这些表中的每一行都会描述这种关系。但这是一个整洁的部分,多个产品可以使用相同的部分,多个部分可以使用相同的元素。
选择只是稍微复杂一点,看起来像这样:
select *
from product
join prodparts on procparts.prod_id = product.prod_id
join parts on parts.part_id = prodparts.part_id
join partselement on partelement.part_id = parts.part_id
join elements on elements.el_id = partelement.parts_id
where product.prod_id = x
答案 1 :(得分:0)
你的第一个方法似乎相当坚实。第二种方法将难以维护元素的数据。我在第一个设计中注意到的一件事是产品和零件都有“价格”。它们是指不同的东西,还是零件价格的总和等于产品的最终价格?如果是这样,我建议删除产品级别的price字段,并在部件级别使用sum()函数。
除此之外......干得好!