我在设置一个包含类别和子类别列表的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)
)
这会起作用还是完全错误?在此先感谢您的帮助!
答案 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)
)