如何在DB中存储级联类别

时间:2014-07-18 11:10:45

标签: sql sql-server database stored-procedures categories

我在存储多个分类数据时遇到问题。一个类别可以具有任何大小的级联深度。我认为用关系创建更多表并不是一个好主意。存储此类分类数据的最佳方法是什么。

ex categories:
 -MainCategory1
     -subcategory1
            -subcategory11
            -subcategory12
            -subcategory13
                   --subcategory131
     -subcategory2
            -subcategory21
            -subcategory22
                   -subcategory221
            -subcategory23
                   -subcategory231
                        -subcategory2311
 -MainCategory2
     -subcategory21
            -subcategory211
                   -subcategory2131
                        -subcategory2131
            -subcategory212
            -subcategory213
                   -subcategory2131

4 个答案:

答案 0 :(得分:2)

一种常见做法是创建一个表,其中每个类别都有一个id,一个名称和一个父ID(顶级类别的父ID为null):

CREATE TABLE categories (
     id NUMERIC PRIMARY KEY,
     name VARCHAR(100),
     parent_id NUMERIC FOREIGN KEY REFERENCES categories(Id)
)

您的某些数据,例如,如下所示:

INSERT INTO categories VALUES (1, 'MainCategory1', null);
INSERT INTO categories VALUES (2, 'subcategory1', 1);

答案 1 :(得分:1)

您需要定义父子结构

CREATE TABLE CATEGORIES (ID INT, PARENT_ID INT, NAME VARCHAR)

然后您选择没有PARENT_ID

的类别
SELECT * FROM CATEGORIES WHERE PARENT_ID IS NULL

他们是主人,然后在你选择的每一层上

SELECT C.* FROM CATEGORIES C 
INNER JOIN CATEGORIES C1 ON C1.PARENT_ID = C.ID 

获得当前记录的孩子。

然后插入类别

INSERT INTO CATEGORIES 
SELECT 1, NULL, 'MainCategory1'
UNION ALL SELECT 10, 1, 'subcategory1'
UNION ALL SELECT 11, 10, 'subcategory11'
UNION ALL SELECT 12, 10, 'subcategory12'
UNION ALL SELECT 13, 10, 'subcategory13'
UNION ALL SELECT 131, 13, 'subcategory131'
UNION ALL SELECT 2, 1, 'subcategory2'
-- ...AND SO ON

答案 2 :(得分:1)

SQL Server实现hierarchyid数据类型。

你应该考虑使用它。

http://msdn.microsoft.com/en-us/library/bb677173.aspx

答案 3 :(得分:1)

使用关系数据库来包含分层数据这是一个长期存在的问题。一般来说,它是使用自引用表完成的,但这始终是一个绝对的工作。我总觉得Java的设计者注意到常用的最好的分层数据库是磁盘的目录结构。这就是Java使用的东西!

许多DBMS都具有增强功能,可以更轻松地处理分层数据。它们对于开发人员的成功和难度是否有效(或不成功)。我最近制定的一种方法可以看作是对SO问题的回答here。它不完整。但是将节点或整个子树从一个地方移动到另一个地方的行为只是一个数学运算,而不是重新调整FK指针。