【问题标题】:Best database & schema for a tree?树的最佳数据库和模式?
【发布时间】:2015-08-29 04:38:16
【问题描述】:

哪种数据库(和架构,如果适用)最适合存储和检索可放置在任意定义树的任何节点的数据(位置、时间戳)?例如:您拥有的一本书的位置:

                                     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 db,树级别的深度/宽度可能会受到限制,但列标签可能会有所不同,另一方面,如果项目移动到新位置,Mongo 可以简单地为项目创建一个新文档。

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

【问题讨论】:

  • 您绝对可以在关系数据库中表示一棵树,但是有许多不同的方法可以做到这一点,每种方法都有不同的权衡。如果没有更多关于您打算进行哪些查询和转换的详细信息,就不可能回答哪个是最好的。

标签: mysql mongodb database-design database


【解决方案1】:

位置,尤其是由不同组织管理的位置,不一定是分层的。例如,俄罗斯在欧洲和亚洲。特克萨卡纳位于德克萨斯州和阿肯色州。美国邮政编码 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,则不需要嵌套集、物化路径或闭包表。

【讨论】:

    【解决方案2】:

    当您说“SQL DB”时,我认为您指的是关系数据库。为此,您似乎需要一个分层数据库。您可以在关系数据库中获得这样的结构。它被称为嵌套集模型。见:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

    【讨论】:

      猜你喜欢
      • 2012-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多