产品类别的树结构数据库模式

时间:2012-04-28 12:49:33

标签: sql database-design relational-database

我正在为电子商务网站创建数据库,但我遇到了产品类别的数据库架构问题,这就像树结构一样。

供应商可以属于一个或多个部门,部门可以有一个或多个类别,类别可以有一个或多个子类别。类似的子类别可以让孩子如此......

产品应映射到供应商(如果部门未知)或部门(如果类别未知)或子类别等等。

这种复杂关系数据库的最佳方式是什么?

3 个答案:

答案 0 :(得分:1)

我花了几天时间解决这个问题。

场景:

在以下领域销售绳索:汽车配件>船舶配件>配件

  • 某些绳索仅在Marine> Accessories中出售
  • 某些绳索仅在附件(顶部菜单项)中出售
  • 有些绳索在全部3种产品中出售
  • 通常,任何项目都需要在任意数量的分支中列出,并且每个分支的深度必须尽可能。 (该平台仅允许3个,但为将来而设计)

馆藏是一种商店平台允许组织物品的方式。 它们的字段是有限的,只有“标记”字段似乎可用于自定义信息。这是系统中离散项的逗号分隔字段。

以下是我的方案的Collection ~~标准定义组合:

  • 附件~~标签=“附件”
  • 汽车>附件~~标签=“汽车>附件”
  • 海洋>配件~~标签=“海洋>配件”

我有一个包含3个类别的类别表:

Category_ID | Category_Text
 1             Accessories
 2             Automotive
 3             Marine

我出售2条绳索:汽车牵引绳通用尼龙绳

产品表:

Product_ID | Product_Title
 1            Automotive Tow-Rope 
 2            General Purpose Nylon Rope

我的数据Feed带有一个Category字段,其中所有分支均以竖线分隔。

..., Title, Category, ...
..., "Automotive Tow-Rope",  "Automotive > Accessories", ...
..., "General Purpose Nylon Rope", "Accessories | Automotive > Accessories | Marine > Accessories", ...

我将“类别”字段拆分为一个关系表,例如Product_Category_Relationship数据:

Product_ID | Branch | Level | Category_ID  (Showing text for clarity)
 1            1        1       2           (Automotive
 1            1        2       1                       + Accessories)
 2            1        1       1           (Accessories)
 2            2        1       2           (Automotive 
 2            2        2       1                       + Accessories)
 2            3        1       3           (Marine
 2            3        2       1                       + Accessories)

这样,我可以看到多个分支,每个类别路径的深度以及所有类别路径。

目前,我正在本地使用SQL Server来操作文件。我终于得到了这个查询,以一种非标准化的方式将其全部组合在一起。

*** TO DO: JOIN CATEGORY TABLE FOR ACTUAL TEXT VS CAT_ID LIKE EXAMPLE ***
SELECT prod_id,  STRING_AGG (branchpath,' | ') AS allpaths
FROM
    (SELECT prod_id, branch,  STRING_AGG (cat_id,',') WITHIN GROUP (ORDER BY depth) AS branchpath
    FROM prod_cat_rel
    GROUP BY prod_id, branch) t
GROUP BY prod_id

STRING_AGG 函数是最终的救生器。我也看到了其他平台上有关类似功能的讨论,因此这不是SQL Server专用的解决方案。

我尝试了很多方法来使数据合理且灵活地排列,并且知道有些人会主张采用其他层次结构,但这对我有用。

很快,我将完成我的新商店并从我的网站链接它:C'mon! (cmonsgo.com)

我希望这对其他人有帮助。 亚当

答案 1 :(得分:0)

嘿,你可以在单桌中做到这一点。

ID  PARENT_ID   NAME
------------------------------
1   0           vendor1
2   0           vendor2
3   1           department11
4   1           department12
5   2           department21    
6   3           category11
7   6           subcategory11

从上面你可以理解整个......

答案 2 :(得分:0)

这是一个反复出现的问题。在纯SQL数据库中有两种常见的存储层次结构的方法(有些具有层次结构扩展,这使它更容易)。

第一个是@ketan建议的解决方案。这种模型的挑战在于,很难找到完整的子代集合-本机SQL不会进行递归,因此“为Vendor x查找所有子代”可能很难。

替代方案为suggested by Joe Celko,通常称为“嵌套集”。 Wikipedia上的示例很简单:

Node        Left    Right
Clothing    1   22
Men's       2   9
Women's     10  21
Suits       3   8
Slacks      4   5
Jackets     6   7
Dresses     11  16
Skirts      17  18
Blouses     19  20
Ball Gowns  12  13
Sun Dresses 14  15

查找给定父母的所有孩子很容易:

SELECT Child.Node, Child.Left, Child.Right
FROM Tree as Parent, Tree as Child
WHERE
    Child.Left BETWEEN Parent.Left AND Parent.Right
    AND Parent.Left = 1  -- Given Parent Node Left Index