【问题标题】:Designing a SQL table with hierarchy/sub-categories设计具有层次结构/子类别的 SQL 表
【发布时间】:2011-01-08 10:01:56
【问题描述】:

我有一个看起来像这样的表:

ID |关键字 |类别 |子类别 |子子类别 |子子子类

我是否需要将其拆分为两个表(关键字表和具有父 ID 的类别表) 如果一个关键字只能属于一个类别,子类别...等。意思是没有重复。还需要拆分吗?

【问题讨论】:

    标签: sql normalization categorization


    【解决方案1】:

    我会在两个表中执行此操作,每个外键都来自类别表:

    Keywords 
    id (PK)
    keyword
    category_id (FK)
    
    Categories
    category_id (PK)
    category
    parent_category_id (FK)
    

    类别表中的数据如下所示:

    category_id    category    parent_category_id
    1              Food        null
    2              meat        1
    3              organic     1
    4              fruit       3
    

    关键字表中的数据如下所示:

    id     keyword    category_id
    1      grapes     4
    2      chicken    2
    

    【讨论】:

    • 这太棒了!谢谢。根据另一个答案,我会将其拆分为性能并遵循您的设计。
    【解决方案2】:

    您只需要一张表来表示 1-1 映射。要表示 1-many 或 many-many 映射,您应该使用多个表。

    如果一个关键词只能对应一个类/子类/子子类,你现在的布局应该没问题。

    一个警告:如果您想根据关键字进行搜索,则分隔表格可能会提高性能。执行整数搜索要快得多。

    关于将关键字值存储在另一个表中的讨论大致对应于this discussion 在另一个表中存储国家名称(大部分是静态的)。使用另一个表的一些关键优势可能是(口语)语言独立性、快速搜索以及以后易于更新。

    【讨论】:

      【解决方案3】:

      我会使用这样的两个表。

         Categories
      -------------------
      PK,FK1 | CategoryID
             | Keyword 
             | Category 
      
        SubCategories
      --------------------
      PK,FK1 | CategoryID
      PK,FK1 | SubCategoryID
      

      【讨论】:

        【解决方案4】:

        如果您希望稍后重命名或重新排列类别,将其拆分可能是有意义的:

        • 如果您保持原样,则必须为此中的每一行执行重命名/重组步骤(更改类别/子类别/子子类别/子子类别字段)包含该 (((sub)sub)sub) 类别的表。这会导致更复杂的查询,并且如果此关键字表中有很多行,则可能是性能问题(=数据库需要一段时间);另一方面,查询(阅读)将尽可能快。
        • 如果将其拆分,则更新 (((sub)sub)sub)category 只会对更少的行进行,但查询(读取)将花费更长的时间,因为它必须与两个(或更多)表一起使用.

        权衡两者的利弊,然后做出决定。m

        【讨论】:

          【解决方案5】:

          为什么不直接在 PK 中添加 ParentID 列和 FK?

          【讨论】:

            猜你喜欢
            • 2011-05-07
            • 2013-11-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-21
            相关资源
            最近更新 更多