【问题标题】:How to store cascade categories in DB如何在数据库中存储级联类别
【发布时间】:2014-07-18 11:10:44
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    一种常见的做法是创建一个表,其中每个类别都有一个 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);
    

    【讨论】:

    • 我明白了。非常感谢。
    【解决方案2】:

    你需要定义父子结构

    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
    

    【讨论】:

    • 我有这个想法。非常感谢。
    【解决方案3】:

    SQL Server 实现了hierarchyid 数据类型。

    你应该考虑使用它。

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-01-01
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多