首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数据库中表示产品分类

问在数据库中表示产品分类
EN

Stack Overflow用户
提问于 2010-12-02 22:21:14
回答 6查看 938关注 0票数 2

我必须在数据库中表示一个具有父子关系的复杂产品分类。有人能指导我这样做吗??

例如,根可能是“所有产品”,然后可能是第二级,我们有“计算机”和“家具”,就像一棵树??

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-12-02 22:27:48

下面是一个使用SQL Server 2005的简单树示例:

代码语言:javascript
复制
--go through a nested table supervisor - user table and display the chain
DECLARE @Contacts table (id varchar(6), first_name varchar(10), reports_to_id varchar(6))
INSERT @Contacts VALUES ('1','Jerome', NULL )  -- tree is as follows:
INSERT @Contacts VALUES ('2','Joe'   ,'1')     --                      1-Jerome
INSERT @Contacts VALUES ('3','Paul'  ,'2')     --                     /        \
INSERT @Contacts VALUES ('4','Jack'  ,'3')     --              2-Joe           9-Bill
INSERT @Contacts VALUES ('5','Daniel','3')     --            /       \              \
INSERT @Contacts VALUES ('6','David' ,'2')     --     3-Paul          6-David       10-Sam
INSERT @Contacts VALUES ('7','Ian'   ,'6')     --    /      \            /    \
INSERT @Contacts VALUES ('8','Helen' ,'6')     -- 4-Jack  5-Daniel   7-Ian    8-Helen
INSERT @Contacts VALUES ('9','Bill ' ,'1')     --
INSERT @Contacts VALUES ('10','Sam'  ,'9')     --

DECLARE @Root_id  char(4)

--get 2 and below
SET @Root_id=2
PRINT '@Root_id='+COALESCE(''''+@Root_id+'''','null')
;WITH StaffTree AS
(
    SELECT 
        c.id, c.first_name, c.reports_to_id, c.reports_to_id as Manager_id, cc.first_name AS Manager_first_name, 1 AS LevelOf
        FROM @Contacts                  c
            LEFT OUTER JOIN @Contacts  cc ON c.reports_to_id=cc.id
        WHERE c.id=@Root_id OR (@Root_id IS NULL AND c.reports_to_id IS NULL)
    UNION ALL
        SELECT 
            s.id, s.first_name, s.reports_to_id, t.id, t.first_name, t.LevelOf+1
        FROM StaffTree            t
            INNER JOIN @Contacts  s ON t.id=s.reports_to_id
    WHERE s.reports_to_id=@Root_id OR @Root_id IS NULL OR t.LevelOf>1
)
SELECT * FROM StaffTree

输出:

代码语言:javascript
复制
@Root_id='2   '
id     first_name reports_to_id Manager_id Manager_first_name LevelOf
------ ---------- ------------- ---------- ------------------ -----------
2      Joe        1             1          Jerome             1
3      Paul       2             2          Joe                2
6      David      2             2          Joe                2
7      Ian        6             6          David              3
8      Helen      6             6          David              3
4      Jack       3             3          Paul               3
5      Daniel     3             3          Paul               3

(7 row(s) affected)

更改@Root_id以获得不同的输出:

代码语言:javascript
复制
@Root_id=null
id     first_name reports_to_id Manager_id Manager_first_name LevelOf
------ ---------- ------------- ---------- ------------------ -----------
1      Jerome     NULL          NULL       NULL               1
2      Joe        1             1          Jerome             2
9      Bill       1             1          Jerome             2
10     Sam        9             9          Bill               3
3      Paul       2             2          Joe                3
6      David      2             2          Joe                3
7      Ian        6             6          David              4
8      Helen      6             6          David              4
4      Jack       3             3          Paul               4
5      Daniel     3             3          Paul               4

(10 row(s) affected)
票数 2
EN

Stack Overflow用户

发布于 2010-12-02 22:24:45

每条记录都有一个父id。它引用同一表中的另一条记录。

根元素的父id为NULL。

当然,最好将其编入索引。

在某些用法中,也有一个指向其第一个直接同级的记录点是有效的。

票数 1
EN

Stack Overflow用户

发布于 2010-12-02 22:28:29

我将首先确定您是否要在树中具有固定的、预先确定的级别数量,或者是否需要动态添加级别。

在前一种情况下,一个结构可能是一组简单的表,例如'product _superclass‘、'product_class’和'product‘。product_class可以有一个指向product_class的外键,产品可以有一个引用product_class的外键。

如果您不知道级别的数量,那么您可能只需要一个表(假设任何产品只有一个父级)。在这种情况下,每一行都可以有选择地引用同一个表中的父级。

固定数量的级别可能会使查询变得更容易、更具可读性,但灵活性明显降低。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4335971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档