【问题标题】:Items from multiple categories best practices来自多个类别的项目最佳实践
【发布时间】:2010-09-27 01:33:49
【问题描述】:

我正在制作类别中的项目列表,问题是项目可以属于多个类别。 您将项目存储在类别中的最佳做法是什么?如何列出类别及其子类别中的所有项目?我正在使用 Zend Framework 和 MySQL 来解决这个问题。

感谢您的回复。

对不起我的英语:)

【问题讨论】:

    标签: php sql mysql zend-framework join


    【解决方案1】:

    所以,您在类别中有一个层次结构,是吗?它是一个级别(类别和子类别)还是任何数量(孩子可以有孩子等)?这将影响解决方案是什么。

    通常,您会使用多对多关系来建模这样的东西,例如:

    CREATE TABLE Item(
      item_id INT NOT NULL, 
      item_name VARCHAR(255) NOT NULL
    )
    CREATE TABLE Category(
      category_id INT NOT NULL, 
      category_name VARCHAR(255) NOT NULL
    )
    CREATE TABLE Item_Category(
      item_id INT NOT NULL REFERENCES Item(item_id), 
      category_id INT NOT NULL REFERENCES Category(category_id)
     )
    

    “Item_Category”中的记录意味着列出的项目在列出的类别中。然后,您可以在这些表中的 2 个(或 3 个)之间进行连接,以列出哪些项目属于哪些类别:

    SELECT I.* 
      FROM Item I 
        INNER JOIN Item_Category IC ON I.item_id = IC.item_id 
        INNER JOIN Category C on IC.category_id = C.category_id 
      WHERE 
        C.category_name = 'MyCategory'
    

    或者一个项目有哪些类别:

    SELECT C.*
      FROM Category C
        INNER JOIN Item_Category IC.category_id = C.category_id 
        INNER JOIN Item I on IC.item_id = I.item_id
      WHERE 
        I.item_name = 'MyItem'
    

    如果类别中存在层次结构,可以使用类别表中的递归关系表示,例如:

    CREATE TABLE Category(
      category_id INT NOT NULL, 
      category_name VARCHAR(255) NOT NULL,
      parent_category_id INT NOT NULL REFERENCES Category(category_id)
    )
    

    这使事情变得更加复杂,因为您必须使用递归查询来获取某个类别及其子类别的所有记录。一个更简单的方法,如果你只有两个级别的类别,它可以简单地使其成为类别表上的第二个字段,例如:

    CREATE TABLE Category(
      category_id INT NOT NULL, 
      category_name VARCHAR(255) NOT NULL,
      subcategory_name VARCHAR(255) NULL
    )
    

    【讨论】:

    • 明确地说,在最后一个版本的类别表中,每个子类别有一条记录。所以真的,它应该被称为 Subcategory 表,PK 为“subcategory_id”。
    【解决方案2】:

    如果一个项目可以属于多个类别,那么这些不是“类别”。它们更像是标签。

    在您的项目和标签之间使用多对多关系。如果您想要标签的层次结构,那就去吧;但它通常是矫枉过正的,很少增加价值。

    【讨论】:

      【解决方案3】:

      通常,我发现在大多数情况下都有效的最佳解决方案就是在您的类别表中使用 parent_id 字段。这样,您只需要一个类别表。如果您愿意,这将支持任意数量的级别或仅支持一个级别(在这种情况下,需要在您的代码中阻止创建第三级类别的能力)。

      例如:
      CREATE TABLE category ( id INT NOT NULL AUTO_INCREMENT, parent_id INT NOT NULL DEFAULT '0' name VARCHAR(255) NOT NULL ) 这样更简单。 parent_id 为 0 的任何类别都将是您的最高级别。如果您有一个 id 为 1 的类别,并且您创建了一个子类别,那么它的 parent_id 将为 1 等等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        • 1970-01-01
        • 2017-08-24
        • 2012-05-22
        • 1970-01-01
        • 2018-08-08
        相关资源
        最近更新 更多