MySQL类别和子类别表结构

3

我在设置一个能够存储类别和子类别的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)
)

这样行吗?还是完全错误的?提前感谢您的帮助!


@three3 如果你看答案,会在投票的上下箭头下面看到一个小勾,点击它。每个问题只能接受一个答案,但如果你觉得其他答案也有用,可以对任何其他答案进行投票,包括被接受的答案。 - delete me
3个回答

6
如果您确定只有两个级别的类别(主要和子类别),那么可以做一些不同的事情。但这些方法都不是您提出的解决方案:
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';

Want all 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';

如果您想要的是“车辆”类别中的某些内容,但不属于车辆的任何子类别,请创建一个主分类为“vehicles”,子分类为空的分类记录。
当然,这种方法并不特别灵活。您只能使用两个级别的分类,并且您的分类模型中没有太多业务逻辑。但对于您的需求来说可能已经足够了。
另外两种好的、经过验证的模型是相邻列表模型和嵌套集模型,两者都在这里用许多漂亮的示例mysql代码进行了描述。

5

这要看情况而定。

类别和子类别真的是两个不同的东西吗?这意味着类别没有父级,而子类别总是在父类别中,并且没有更多的子类别。那么两个表就可以了。

但如果像一棵树一样,有类别,既可以是子类别,也可以有子类别,那么应该使用一个表(可搜索“嵌套集合”)。

(或者你可能不是指类别/子类别,而是指主类别/次级类别,其中次级类别不固定为某个特定的主类别。例如Electronics + Cycling而不是Cycling->Speedometers。那么如果可以同时使用Cycling + Electronics,则可以使用一个表)


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接