我有两个表,其中一个是category
,另一个是sub-category
。对于许多表,将两个表分配给FK
。在某些情况下,我们会将子类别的一条记录移至主要类别。所以这次出现约束错误,因为与其他表关联的键。所以我不会创建这个架构。
所以现在我打算在同一个表中创建类别和子类别,并在创建关系表中建立关系。
category table:
id(PK,AUTO Increment),
item===>((1,phone),(2.computer),(3,ios),(4,android),(5,software),(6,hardware)).
relationship table:
id,cate_id(FK),
parentid(refer from category table)===>((1,1,0),(2,2,0),(3,3,1),
(4,4,1),(5,5,2),(5,5,3)).
在我这边不会超过三级。
如果我们轻松地移动到子类别到主要类别ex:(4,4,1) to (4,4,0)
而不影响任何其他表。这是一个很好的程序吗?
有任何其他想法意味着让我知道吗?
答案 0 :(得分:1)
如果树中有多个级别,并且想要查找任何类别的所有子类别,则可能会出现问题。这将需要多个查询或递归查询。
您可以改为查看"Nested Sets"数据结构。它支持有效查询任何子树。它确实有一个代价高昂的更新,但更新可能不会经常发生。如果需要,您可以批量更新并在一夜之间运行它们。
create table Category (
Id int not null primary key auto_increment,
LeftExtent int not null,
RightExtent int not null,
Name varchar(100) not null
);
create table PendingCategoryUpdate (
Id int not null primary key auto_increment,
ParentCategoryId int null references Category ( Id ),
ParentPendingId int null references PendingCategoryUpdate ( Id ),
Name varchar(100) not null
);
如果您的类别数量很少,那么正常的父参考就足够了。您甚至可以将类别读入内存进行处理。
create table Category (
Id int not null primary key auto_increment,
ParentId int null references Category ( Id ),
Name varchar(100) not null
);
-- Just an example
create table Record (
Id int not null primary key auto_increment,
CategoryId int not null references Category ( Id )
);
select *
from Record
where CategoryId in (1, 2, 3); -- All the categories in the chosen sub-tree
答案 1 :(得分:0)
如何创建一个表如下:
categories(
id int not null auto_increment primary key,
name char(10),
parent_id int not null default 0)
其中parent_id是id的FK,即表的PK。 当parent_id为0时,此类别是主要类别。当它是> 0,这是该父级的子类别。 要查找类别的父级,您将进行自我加入。