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

SQL中存储多级描述的最佳方法是什么?,sql,arrays,multidimensional-array,Sql,Arrays,Multidimensional Array,我需要一个新的视角来研究如何设计一个可靠、高效的SQL数据库来存储多级数据数组 这个问题适用于许多情况,但我提出了一个例子: 有数百种产品。每个产品都有未定义数量的零件。每个部分都由几个元素构成 所有产品的描述方式相同。所有零件都需要相同的字段来描述它们(比如:价格、重量、零件名称),所有零件的所有元素也有统一的设计(例如:元素代码、制造商)。简单明了。 一个元素可能仅与一个零件相关,而每个零件仅与一个产品相关 我想到了三张桌子: Products: ----------------------

我需要一个新的视角来研究如何设计一个可靠、高效的SQL数据库来存储多级数据数组

这个问题适用于许多情况,但我提出了一个例子:
有数百种产品。每个产品都有未定义数量的零件。每个部分都由几个元素构成

所有产品的描述方式相同。所有零件都需要相同的字段来描述它们(比如:价格、重量、零件名称),所有零件的所有元素也有统一的设计(例如:元素代码、制造商)。简单明了。
一个元素可能仅与一个零件相关,而每个零件仅与一个产品相关

我想到了三张桌子:

Products:
--------------------------------------------
prod_id   prod_name   prod_price   prod_desc 
1            hoover          120      unused
下一个

最后

Elements:
---------------------------------------
el_id  el_code  el_manufacturer part_id
    1    BFG12               GE       3
现在,选择所需的产品,从prod_id相同的零件中选择“全部”,然后从零件id匹配的元素中选择“全部”——在多次查询之后,您就获得了所有数据

我只是不确定这是否是正确的方法。
我还有一个想法,没有元素表。
这将减少查询,但我有点担心这可能是一种蹩脚和糟糕的做法。
零件表中还有两个字段,而不是元素表,因此看起来是这样的:
零件id、零件名称、零件价格、零件重量、产品id、零件代码、零件制造商 它们将是文本类型,对于每个部分,有关元素的信息将存储为字符串,如下所示:

part_el_code         | code_of_element1; code_of_element2; code_of_element3

part_el_manufacturer | manuf_of_element1; manuf_of_element2; manuf_of_element3
然后,我们只需要分解这些字段中的()数据,就可以得到易于显示的数组。 当然,这并不完美,也有一些局限性,但这个想法行吗

我之所以提出第二个变体,是因为第三个表元素最终会变得相当大。如果有10000个产品,每个产品有4个零件,每个零件平均有3个元素,这意味着元素表中必须有120000行。老实说,我真的不知道这是否会导致性能问题


我是否应该接受第一个想法?或者有更好的方法来解决这个问题?

你的第一个方法似乎很可靠。第二种方法将使维护要素数据变得困难。我在第一次设计中注意到的一点是,产品和零件都有“价格”。它们是指不同的东西还是零件价格的总和等于产品的最终价格?如果是这样,我建议删除产品级别的price字段,并在部件级别使用sum()函数


除此之外。。。干得好

描述事物之间的关系正是关系数据库所做的。任何关于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
这很好,完全可以满足您的要求


就你的第二个想法而言,它真的很糟糕。当您使用关系数据库时,它允许您存储数据集并将其关联起来。将列表存储在字符串值中就是忽略了关系数据库设计的功能


但是,有一种方法可以改进您的设计。我认为你们可能并不总是对产品和零件或者零件和元素有一对一的关系。因此,我建议如下

首先从零件表中删除产品id,然后从元素表中删除零件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
现在,这些表中的每一行都将描述这种关系。但这是一个整洁的部分,多个产品可以使用相同的部分,多个部分可以使用相同的元素

选择只是稍微复杂一点,如下所示:

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

查询BOM“物料清单”感谢您的及时回复。感谢您的所有意见和想法。我将考虑您建议的改进。此外,我担心性能,Elements表可能会变得相当大,可能超过100000行。@gime:sql Server设计用于处理大型数据集并进行良好链接--您可以做一些事情来帮助您--设置索引可能是最重要的。如果您的所有表都有一个良好的索引(并且服务器没有资源匮乏),那么100k不应该是一个问题。