MySQL类别和子类别表结构

标签 mysql database database-design

我在设置一个包含类别和子类别列表的 mysql 表时遇到了一些问题。我不确定如何设置表格。是否需要是 2 个单独的表? 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)
)

这行得通还是完全错误?在此先感谢您的帮助!

最佳答案

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

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

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


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

关于MySQL类别和子类别表结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3169559/

相关文章:

python - 拥有一个可以属于其他两个模型中的任何一个的 django 模型(外键关系)

database-design - 您是否应该在数据库级别和应用程序级别强制实现约束?

mysql - 从两个表中获取数据并从表 A 中获取所有行

php - <br/> 的行尾检查

sql - 扩展表中列的长度 - 它会破坏数据库中的什么?

java - 如何测试 jdbc 中的更新方法

sql - 外键可以为空吗?

C# 应用程序进程在一段时间后挂起

php - 未获取 Laravel 外键表 [错误]

MYSQL INSERT 或 UPDATE IF