MySQL类别和子类别表结构

时间:2010-07-02 22:54:00

标签: mysql database database-design

我在设置一个包含类别和子类别列表的mysql表时遇到了一些问题。我不确定如何设置表。它需要是2个独立的表吗? 1个主要类别和1个子类别,还是全部在1个表中?这样的事情会起作用吗?

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)
)

这会起作用还是完全错误?在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

取决于。

类别和子类别真的是两个不同的东西吗?这意味着类别没有父类,而子类别总是在父类别中,并且没有其他子类。然后两张桌子就可以了。

如果它就像一棵树,只有类别,可以是儿童和有孩子,你应该使用一个表(谷歌“嵌套集”)。

(或许你不是指类别/子类别,而是主要类别/次要类别,其中次要类别不固定到某个主要类别。电子+骑自行车而不是骑自行车 - >速度计。然后你可以使用一个表,如果它也可以是Cycling + Electronics)

答案 1 :(得分:4)

如果你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';

想要所有roflcopters吗?

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

如果您想要“车辆”类别中的某些内容,而不是车辆的任何子类别中的内容,则只需要一个类别记录,其中main ='vehicles'具有子NULL。

当然,这不是特别灵活。您只关注两个级别的分类,并且您的类别模型中没有嵌入很多业务逻辑。但它可能足以满足您的需求。


其他两个优秀的,经验证的模型是邻接列表模型和嵌套集模型,两者都有描述,有很多很好的示例mysql代码,over here

答案 2 :(得分:0)

显然是可行的。但是您可以使用单独的表。

create table categories 
(
    categoryId int not null,
    categoryName varchar(20) not null,
    primary key(categoryId)
);

create table subcategories 
(
    subcategoryId int not null,
    subcategoryName varchar(20) not null,
    parentId int not null, 
    primary key(subcategoryId),
    foreign key(categoryId) references categories(categoryId)
);


create tables 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(categoryId) references categories(categoryId),
    foreign key(subcategoryId) references subcategories(subcategoryId)
 )