我正在为电子商务网站创建一个数据库,但我遇到了产品类别的数据库架构问题,这就像树结构一样。
供应商可以属于一个或多个部门,部门可以有一个或多个类别,而类别可以有一个或多个子类别。类似的子类别可以在孩子身上如此......
产品应映射到供应商(如果部门未知)或部门(如果类别未知)或子类别等等。
做这种复杂关系数据库的最佳方法是什么?
嘿,你可以在单桌中做到这一点。
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
从上面你可以理解整个......
我花了几天时间研究这个问题。
场景:
销售绳索:配件,汽车>配件,船舶>配件
集合是某个商店平台允许用户组织商品的方式。他们的字段有限,只有标签字段似乎可用于自定义信息。这是系统中以逗号分隔的离散术语字段。
以下是我的场景的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唯一的解决方案。
我尝试了很多方法将数据转化为逻辑和灵活的安排,并且知道有些人会争论其他层次结构,但这对我有用。
很快,我将完成我的新店并将其链接到我的网站:来吧!来吧! (cmonsgo.com)
我希望这有助于其他人。亚当
这是一个反复出现的问题。在纯SQL数据库中存储层次结构有两种常用方法(一些具有分层扩展,使其更容易)。
第一个是@ketan建议的解决方案。这个模型面临的挑战是很难找到完整的子集 - 本机SQL不会进行递归,因此“查找供应商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