2010-07-02 121 views
1

我在设置一个包含类别和子类别列表的mysql表时遇到了一些问题。我不确定如何设置表格。它是否需要2个独立的表格? 1个主要类别和1个子类别,还是可以全部在1个表格中?会有这样的工作吗?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) 
) 

这项工作还是完全错误?先谢谢您的帮助!

+0

@ three3如果你看一下答案会在你的投票的上下箭头下面点出一点,点击它。每个问题只能接受一个答案,但如果您觉得有用,您可以对任何其他人进行投票,包括*接受*答案。 – 2010-07-02 23:05:58

回答

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

想要所有的操作员吗?

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的子类,只是有一个类别记录,其中主要=“车”与子NULL。

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


两个其他的好,实践证明,模型是邻接表模型和嵌套集模型,这两者都描述了,有很多很好的例子MySQL的代码,over here

4

这取决于。

分类和子分类真的是两回事吗?这意味着类别没有父母,而子类别始终在父类别中,并且没有其他子类别。然后两张桌子就可以了。

如果它像一棵树,但只有类别(既可以是孩子又可以有孩子),您应该使用一个表格(Google“嵌套集合”)。 (或者你可能并不是指类别/子类别,而是主要类别/次要类别,其中次要类别不固定到某个主要类别。电子+自行车而不是自行车 - >速度计。表,如果它也可以是循环+电子)