SQL中存储多级描述的最佳方法是什么?

时间:2010-12-28 04:15:43

标签: sql arrays multidimensional-array

我需要一个关于如何设计可靠高效的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个行。说实话 - 我真的不知道这是否会导致性能问题。

我应该第一个想法吗?或者也许有更好的方法解决这个问题?

2 个答案:

答案 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()函数。

除此之外......干得好!