MySQL 类别和子类别表结构

thr*_*ee3 2 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)
)
Run Code Online (Sandbox Code Playgroud)

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

tim*_*dev 6

如果您 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)
);
Run Code Online (Sandbox Code Playgroud)

想要所有车辆?

SELECT * 
FROM objects AS o 
INNER JOIN categories AS c ON o.category_id = c.id 
WHERE c.main = 'vehicles';
Run Code Online (Sandbox Code Playgroud)

想要所有的直升机吗?

SELECT * 
FROM objects AS o 
INNER JOIN categories AS c ON o.category_id = c.id 
WHERE c.main = 'vehicles' and c.sub='Roflcopters';
Run Code Online (Sandbox Code Playgroud)

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

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


另外两个很好的、经过验证的模型是邻接表模型和嵌套集模型,这两个模型都有描述,有很多很好的示例 mysql 代码,在这里


Bar*_*lom 5

这取决于。

类别和子类别真的是两种不同的东西吗?这意味着类别没有父类别,而子类别始终在父类别中,并且没有其他子类别。那么两张桌子就OK了​​。

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

(或者,您可能不是指类别/子类别,而是主要类别/次要类别,其中次要类别不固定为某个主要类别。电子 + 自行车而不是自行车-> 车速表。然后,如果可以,您可以使用一张表也可以骑自行车+电子)