树的最佳数据库和模式?
Best database & schema for a tree?
哪种数据库(和架构,如果适用)最适合存储和检索可以放置在任意定义树的任何节点上的数据(位置、时间戳)?例如:您拥有的一本书的位置:
Book
| |
Home Work
| | | | |
Bedroom Bathroom Den Office Conf room
| | | | |
Closet Underbed EntCtr Closet Desk
| |
Top Shelf Bottom Shelf
XXXX
对于每个项目记录,项目的位置可能看起来不同,但可能是相同的根节点和主节点,但除此之外,项目实际所在的位置可能有不同的分支和叶子。随着每个添加的项目,树本身可以想象地增长(您可以最终向该 "top shelf in the bedroom closet" 节点添加特异性,将较新的项目放置在 2-3 个子位置之一)。
我认为 SQL 数据库可能并不理想,因为树可以任意扩展并且可能完全不同,具体取决于用户,但不确定 NoSQL 数据库如何 Mongo 可以处理任何 updating/expansion (例如,如果示例书从现有节点移动到新节点一两层)。如果使用 SQL 数据库,树级别的 depth/breadth 可能会受到限制,但列标签可能会有所不同,另一方面 Mongo 可以简单地为项目创建一个新文档,如果它已移至新位置。
非常感谢数据库专家的任何见解!
当您说 "SQL DB" 时,我认为您指的是 关系数据库 。为此,您似乎需要一个分层数据库。您可以在关系数据库中获得这样的结构。它被称为 嵌套集模型 。参见:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
位置,尤其是那些由不同组织管理的位置,不一定是分层的。例如,俄罗斯在欧洲和亚洲。特克萨卡纳位于得克萨斯州和阿肯色州。美国邮政编码 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)
);
然后您可以使用递归通用 Table 表达式 (CTE) 查询这样的 table,它在每个主要数据库中都可用 除了 MySQL,但听起来切换数据库是您的一个选择。
举个例子:http://blog.databasepatterns.com/2014/02/trees-paths-recursive-cte-postgresql.html
如果您的数据库支持 RCTE,则不需要嵌套集、物化路径或闭包 Table。
哪种数据库(和架构,如果适用)最适合存储和检索可以放置在任意定义树的任何节点上的数据(位置、时间戳)?例如:您拥有的一本书的位置:
Book
| |
Home Work
| | | | |
Bedroom Bathroom Den Office Conf room
| | | | |
Closet Underbed EntCtr Closet Desk
| |
Top Shelf Bottom Shelf
XXXX
对于每个项目记录,项目的位置可能看起来不同,但可能是相同的根节点和主节点,但除此之外,项目实际所在的位置可能有不同的分支和叶子。随着每个添加的项目,树本身可以想象地增长(您可以最终向该 "top shelf in the bedroom closet" 节点添加特异性,将较新的项目放置在 2-3 个子位置之一)。
我认为 SQL 数据库可能并不理想,因为树可以任意扩展并且可能完全不同,具体取决于用户,但不确定 NoSQL 数据库如何 Mongo 可以处理任何 updating/expansion (例如,如果示例书从现有节点移动到新节点一两层)。如果使用 SQL 数据库,树级别的 depth/breadth 可能会受到限制,但列标签可能会有所不同,另一方面 Mongo 可以简单地为项目创建一个新文档,如果它已移至新位置。
非常感谢数据库专家的任何见解!
当您说 "SQL DB" 时,我认为您指的是 关系数据库 。为此,您似乎需要一个分层数据库。您可以在关系数据库中获得这样的结构。它被称为 嵌套集模型 。参见:http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
位置,尤其是那些由不同组织管理的位置,不一定是分层的。例如,俄罗斯在欧洲和亚洲。特克萨卡纳位于得克萨斯州和阿肯色州。美国邮政编码 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)
);
然后您可以使用递归通用 Table 表达式 (CTE) 查询这样的 table,它在每个主要数据库中都可用 除了 MySQL,但听起来切换数据库是您的一个选择。
举个例子:http://blog.databasepatterns.com/2014/02/trees-paths-recursive-cte-postgresql.html
如果您的数据库支持 RCTE,则不需要嵌套集、物化路径或闭包 Table。