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

Sql 产品类别的树结构数据库模式,sql,database-design,relational-database,Sql,Database Design,Relational Database,我正在为一个电子商务网站创建一个数据库,但我在产品类别的数据库模式方面遇到了一些问题,这类似于树结构 供应商可以属于一个或多个部门,部门可以有一个或多个类别,类别可以有一个或多个子类别。类似地,子类别可以有它的子类别等等 如果部门未知,则应将产品映射到供应商;如果类别未知或子类别未知,则应将产品映射到部门,以此类推 处理这种复杂关系数据库的最佳方法是什么 嘿,你可以在一张桌子上做这件事 ID PARENT_ID NAME ------------------------------ 1

我正在为一个电子商务网站创建一个数据库,但我在产品类别的数据库模式方面遇到了一些问题,这类似于树结构

供应商可以属于一个或多个部门,部门可以有一个或多个类别,类别可以有一个或多个子类别。类似地,子类别可以有它的子类别等等

如果部门未知,则应将产品映射到供应商;如果类别未知或子类别未知,则应将产品映射到部门,以此类推


处理这种复杂关系数据库的最佳方法是什么

嘿,你可以在一张桌子上做这件事

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

从上面你可以了解整个…

嘿,你可以在一张表中完成这项工作

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

从上面你可以了解整个…

我花了几天时间研究这个问题

情景:

销售绳索:配件,汽车>配件,船舶>配件

有些绳索只在船用>附件中销售 有些绳子只在“附件”菜单项的顶部出售 一些绳索在所有3个市场都有出售 一般来说,任何项目都需要在任意数量的分支中列出,并且每个分支都需要有任何可能的深度。此平台仅允许3个,但设计面向未来 集合是特定商店平台允许人们组织物品的方式。 它们的字段是有限的,似乎只有标记字段可用于自定义信息。这是系统中以逗号分隔的离散术语字段

以下是我的场景的集合~~条件定义组合:

附件~~标签=附件 汽车>附件~~标签=汽车>附件 海事>附件~~标签=海事>附件 我有一个包含3个类别的类别表:

Category_ID | Category_Text
 1             Accessories
 2             Automotive
 3             Marine
我卖两条绳子:一条汽车牵引绳和一条通用尼龙绳

产品表:

Product_ID | Product_Title
 1            Automotive Tow-Rope 
 2            General Purpose Nylon Rope
我的数据提要附带一个类别字段,其中所有分支都以管道分隔

..., Title, Category, ...
..., "Automotive Tow-Rope",  "Automotive > Accessories", ...
..., "General Purpose Nylon Rope", "Accessories | Automotive > Accessories | Marine > Accessories", ...
我将类别字段拆分为一个关系表,如以下产品\类别\关系数据:

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唯一的解决方案

我尝试了很多方法使数据具有逻辑性和灵活性,并且知道有些人会支持其他层次结构,但这对我来说是可行的

很快,我将完成我的新店,并从我的网站链接它:加油!cmonsgo.com

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

我花了几天时间研究这个问题

情景:

销售绳索:配件,汽车>配件,船舶>配件

有些绳索只在船用>附件中销售 有些绳子只在“附件”菜单项的顶部出售 一些绳索在所有3个市场都有出售 一般来说,任何项目都需要在任意数量的分支中列出,并且每个分支都需要有任何可能的深度。此平台仅允许3个,但设计面向未来 集合是特定商店平台允许人们组织物品的方式。 它们的字段是有限的,似乎只有标记字段可用于自定义信息。这是系统中以逗号分隔的离散术语字段

以下是我的场景的集合~~条件定义组合:

附件~~标签=附件 汽车>附件~~标签=汽车>附件 海事>附件~~标签=海事>附件 我有一个包含3个类别的类别表:

Category_ID | Category_Text
 1             Accessories
 2             Automotive
 3             Marine
我卖两条绳子:一条汽车牵引绳和一条通用尼龙绳

产品表:

Product_ID | Product_Title
 1            Automotive Tow-Rope 
 2            General Purpose Nylon Rope
我的数据提要附带一个类别字段,其中所有分支都以管道分隔

..., Title, Category, ...
..., "Automotive Tow-Rope",  "Automotive > Accessories", ...
..., "General Purpose Nylon Rope", "Accessories | Automotive > Accessories | Marine > Accessories", ...
我将类别字段拆分为一个关系表,如以下产品\类别\关系数据:

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唯一的解决方案

我尝试了很多方法使数据具有逻辑性和灵活性,并且知道有些人会支持其他层次结构,但这对我来说是可行的

很快,我将完成我的新店,并从我的网站链接它:加油!cmonsgo.com

我希望这对其他人有帮助。
亚当这是一个反复出现的问题。在纯SQL数据库中存储层次结构有两种常见的方法,其中一些具有层次结构扩展,这使得存储更容易 第一个是@ketan建议的解决方案。这个模型的挑战是很难找到完整的子对象集—本机SQL不执行递归,因此很难找到供应商x的所有子对象

替代方案过去是,现在经常被称为嵌套集。上的示例很简单:

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

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

第一个是@ketan建议的解决方案。这个模型的挑战是很难找到完整的子对象集—本机SQL不执行递归,因此很难找到供应商x的所有子对象

替代方案过去是,现在经常被称为嵌套集。上的示例很简单:

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

这是解决这个问题的一个非常简单的方法。。如何查询它以给出xml MS SQL中的树结构。如果你能给我提供查询,那就太好了。这是实现层次表结构的最好方法还是有更好的方法。在这种结构中,保存部分很容易,但在检索时,我们需要编写多个查询,例如,要了解子类别11的供应商,我们需要通过查询顶部的每个级别来找到它。查询可能与此相关。。。创建表格您的表格id int20主键,父表格id int20引用您的表格id,名称varchar2100;是的,这是树型数据库结构中最受欢迎的结构。这是解决这个问题的一个非常简单的方法。。如何查询它以给出xml MS SQL中的树结构。如果你能给我提供查询,那就太好了。这是实现层次表结构的最好方法还是有更好的方法。在这种结构中,保存部分很容易,但在检索时,我们需要编写多个查询,例如,要了解子类别11的供应商,我们需要通过查询顶部的每个级别来找到它。查询可能与此相关。。。创建表格您的表格id int20主键,父表格id int20引用您的表格id,名称varchar2100;是的,这是树型数据库结构中最受欢迎的结构。最好的意思是什么?最容易存储,还是最快查询?我的意思是最快查询以xml格式@StephaniePageBest表示什么?最容易存储,还是最快查询?我的意思是最快查询以xml格式@StephaniePage获得完整的层次结构