代码之家  ›  专栏  ›  技术社区  ›  three3

MySQL类别和子类别表结构

  •  1
  • three3  · 技术社区  · 14 年前

    我在设置一个mysql表时遇到了一些问题,该表将包含类别和子类别的列表。我不知道怎么摆桌子。需要两张单独的桌子吗?一个是主类别,一个是子类别,还是都在一张表中?想要这个工作吗?

    Create Table categories (
        category_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
        sub_id INT UNSIGNED NOT NULL,
        name VARCHAR(100) NOT NULL,
        PRIMARY KEY (category_id)
    )
    
    CREATE TABLE items (
        item_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
        name VARCHAR(255) NOT NULL,
        description VARCHAR(100) NOT NULL,
        PRIMARY KEY (item_id),
        FOREIGN KEY (category_id) REFERENCES categories (category_id),
        FOREIGN KEY (sub_id) REFERENCES categories (sub_id)
    )
    

    这是有效的还是完全错误的?提前感谢您的帮助!

    2 回复  |  直到 14 年前
        1
  •  4
  •   timdev    14 年前

    如果你100%确信你只有两个级别的类别(主类别和子类别),你可以做一些不同的事情。这些都不是您建议的解决方案:

    CREATE TABLE categories (
        id int not null primary key,
        main varchar(64)
        sub varchar(64)
    );
    
    CREATE TABLE objects (
        id int not null primary key,
        category_id int,
        name varchar(64),
        FOREIGN KEY (category_id) REFERENCES categories (id)
    );
    

    想要所有的车吗?

    SELECT * 
    FROM objects AS o 
    INNER JOIN categories AS c ON o.category_id = c.id 
    WHERE c.main = 'vehicles';
    

    想要所有的出价者吗?

    SELECT * 
    FROM objects AS o 
    INNER JOIN categories AS c ON o.category_id = c.id 
    WHERE c.main = 'vehicles' and c.sub='Roflcopters';
    

    如果您想要的是“车辆”类别中的内容,而不是Verhicles的任何子类别中的内容,只需要有一个类别记录,其中main='vehicles'带有子空值。

    当然,这并不是特别灵活。您只需要进行两个级别的分类,而且您的分类模型中嵌入的业务逻辑并不多。但这可能足以满足您的需求。


    另外两个很好的,已经证明了的模型是邻接列表模型和嵌套集模型,这两个模型都被描述了,有很多很好的示例mysql代码, over here

        2
  •  4
  •   Bart van Heukelom    14 年前

    这要看情况而定。

    类别和子类别真的是两种不同的东西吗?这意味着类别没有父类别,而子类别总是在父类别中,并且没有自己的子类别。那么两张桌子就可以了。

    如果它像一棵树,其中只有类别,既可以是子类,也可以有子类,那么您应该使用一个表(google“嵌套集”)。

    (或者也许你不是指类别/子类别,而是指主要类别/次要类别,次要类别不固定于某个主要类别。电子+自行车而不是自行车-车速表。然后你可以用一张桌子,如果它也可以是自行车+电子设备)