是否有数据库可以表示集合式结构?

时间:2016-10-14 02:02:24

标签: mongodb database

我主要关注查询操作,而不是联合或交集 这是一个例子。

假设我们有一个多级别类别:

  • CATEGORY-TOP-LEVEL:

    • CATEGORY1:

      • CATEGORY1.1:
        • item1
    • CATEGORY2:

      • CATEGORY2.1:
        • item2

此处,项目[N]是数据。类别是树结构,用于表示项目所属的类别。

现在,假设我想查询类别1中的所有数据,数据库应该给我item1。

假设我想查询类别顶级的所有数据,数据库应该给我item1和item2。

就像集合理论一样。因为item1属于CATEGORY1.1,CATEGORY1.1属于CATEGORY1。因此item1属于CATEGORY1。

一种解决方案是使用物化路径:我们在项目中放置一个名为path的字段,值类似于:",CATEGORY-TOP-LEVEL,CATEGORY1,CATEGORY1.2"。但问题是,当我更改类别的名称或类别的层次结构时,它会导致大量的书写操作。

MongoDB可以支持吗?如果没有,是否有数据库可以支持?

P.S。我们考虑一下查询性能。

1 个答案:

答案 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。

其他流行的模型是嵌套集模型,物化路径(你提到过)和闭包表。

这被问了很多。有关更多示例,请参阅标记