2

我有两张桌子,一张是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)如果我们在不影响任何其他表的情况下轻松地将子类别转移到主类别。这是一个好的程序吗?

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

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

4

2 回答 2

1

如果树中有多个级别,并且想要查找任何类别的所有子类别,则可能会出现问题。这将需要多个查询或递归查询。

您可以改为查看“嵌套集”数据结构。它支持对任何子树的有效查询。它确实有一个昂贵的更新,但更新可能不会经常发生。如果需要,您可以批量更新并在夜间运行它们。

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
于 2013-06-28T05:34:37.957 回答
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 时,这是该父级的子类别。要查找类别的父级,您将执行自加入。

于 2013-06-28T05:50:44.947 回答