如何为以下条件创建架构?

时间:2013-06-28 05:13:54

标签: mysql

我有两个表,其中一个是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)而不影响任何其他表。这是一个很好的程序吗?

如果我们保持数百万的记录,将来我们还会面临其他任何问题吗?

有任何其他想法意味着让我知道吗?

2 个答案:

答案 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,这是该父级的子类别。 要查找类别的父级,您将进行自我加入。