最佳数据库&树的架构?

时间:2015-06-13 05:26:28

标签: mysql mongodb database-design database

哪个数据库(和模式,如果适用)最适合存储和检索可以放置在任意定义的树的任何节点上的数据(位置,时间戳)?例如:您拥有的书籍的位置:

                                     Book
                          |                          |
                         Home                       Work
                  |     |        |                |         | 
              Bedroom   Bathroom  Den           Office     Conf room
               |    |             |    |          |
              Closet Underbed    EntCtr Closet    Desk 
           |      |
       Top Shelf  Bottom Shelf
          XXXX

对于每个项目记录,项目的位置可能看起来可能不同,但可能是相同的根节点和主节点,但除此之外可能有不同的分支和离开项目实际所在的位置。并且随着每个添加的项目,树本身可以想象地增长(您可以最终添加特定于“卧室壁橱中的顶部架子”节点,将更新的项目放置在2-3个子位置之一)。

我认为SQL数据库可能不太理想,因为树​​可能会随意扩展,并且可能完全不同,具体取决于用户,但不确定像Mongo这样的NoSQL数据库如何处理任何更新/扩展(如果是示例书)从一个现有节点移动到一个或两个更深的新节点。如果使用SQL数据库,可能会限制树级别的深度/广度,但是列标签可能会有所不同,另一方面,如果项目移动到新位置,Mongo可以简单地为项目创建新文档。

非常感谢数据库专家的任何见解!

2 个答案:

答案 0 :(得分:2)

地点,尤其是由不同组织管理的地点,不一定是分层的。例如,俄罗斯位于欧洲和亚洲。特克萨卡纳位于德克萨斯州和阿肯色州。美国邮政编码42223是in Kentucky and Tennessee。地缘政治地点是图形/网络化的。

话虽这么说,您可以使用邻接列表轻松地在SQL数据库中建模分层数据:

create table locations (
  location_id int primary key,
  name text not null,
  parent_id int null references locations(location_id)
);

然后,您可以使用递归公用表表达式(CTE)查询此类表,这些表可在每个主要数据库(MySQL除外)中使用,但听起来像切换数据库是一种选择。

以下是一个示例:http://blog.databasepatterns.com/2014/02/trees-paths-recursive-cte-postgresql.html

如果您的数据库支持RCTE,则不需要嵌套集,物化路径或关闭表。

答案 1 :(得分:1)

当你说" SQL DB"我认为您引用的是 关系数据库 。为此,您似乎需要 分层数据库 。您可以在关系数据库中获得这样的结构。它被称为嵌套集模型。请参阅:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/