我主要关注查询操作,而不是联合或交集 这是一个例子。
假设我们有一个多级别类别:
CATEGORY-TOP-LEVEL:
CATEGORY1:
CATEGORY2:
此处,项目[N]是数据。类别是树结构,用于表示项目所属的类别。
现在,假设我想查询类别1中的所有数据,数据库应该给我item1。
假设我想查询类别顶级的所有数据,数据库应该给我item1和item2。
就像集合理论一样。因为item1属于CATEGORY1.1,CATEGORY1.1属于CATEGORY1。因此item1属于CATEGORY1。
一种解决方案是使用物化路径:我们在项目中放置一个名为path的字段,值类似于:",CATEGORY-TOP-LEVEL,CATEGORY1,CATEGORY1.2"。但问题是,当我更改类别的名称或类别的层次结构时,它会导致大量的书写操作。
MongoDB可以支持吗?如果没有,是否有数据库可以支持?
P.S。我们考虑一下查询性能。
答案 0 :(得分:0)
每个modern relational数据库都可以支持。
在关系数据库中有不同的建模方法,最常见的方法称为“邻接模型”:
create table category
(
id integer primary key,
name varchar(100) not null,
parent_category_id integer references category
);
如果某个项目只能属于一个类别,则该项目表将如下所示:
create table item
(
id integer primary key,
name varchar(100) not null,
category_id integer not null rerences category
);
如果某个项目属于多个类别,则需要多对多关系(在关系世界中也非常常见)
要使所有类别低于某个类别,您可以使用递归查询:
with recursive cat_tree as (
select id, name, parent_category_id
from category
where id = 42 -- this is the category where you want to start
union all
select c.id, c.name, c.parent_category_id
from category c
join cat_tree p on p.id = c.parent_category_id
)
select *
from cat_tree;
要将项目与类别一起使用,只需将上述内容加入item
表即可。
以上查询是标准ANSI SQL。
其他流行的模型是嵌套集模型,物化路径(你提到过)和闭包表。
这被问了很多。有关更多示例,请参阅标记recursive-query和hierarchical-data。