数据库设计 – 与NoSQL数据库的多对多关系
我想为NoSQL数据库的node.js应用程序实现分类结构(geo terms).我与
MySQL有类似的分类结构,但现在是向前推进并学习新的东西的时候了,所以我决定尝试不同的方法,并使用NoSQL(面向文档)来测试我的测试应用程序.分类结构简单 – 有五个不同的层次:国家(即英国)→地区(英格兰)→县(默西塞德郡)→城市/乡村(利物浦)→城市的一部分(Toxteth).
明显的选择是使用树结构,但恶魔在细节上 – 历史上一些城镇属于其他县.这个想法是用这些条款来标记在某些城市或城镇出生的人,然后用地理标签来过滤它们,所以我必须尊重利物浦或曼彻斯特(等)在当时有人出生的时候是兰开夏郡的一部分.否则任何用户使用我的地理过滤器的结果将不正确. 例如:John Doe于1957年出生于布莱克本(布兰肯郡).保罗·布朗1960年出生于利物浦(兰开夏郡,现在是默西塞德郡).佐治亚州(Nee Jones)5年后出生在Wirral(Cheshire,现在的默西塞德郡).他们的儿子林戈于1982年出生在利物浦(默西塞德郡). 约翰是出生的Lancastrian,保罗是Lancastrian和Merseysider,格鲁吉亚来自柴郡和默西塞德同时,Ringo来自默西塞德郡.所以当我搜查县时,应该按照相应的方式分类.但是,随着国家现代化结构的简单一对多结构,它们将永远不会被过滤掉. 使用NoSQL(首先是面向文档的)解决方案如何实现其结构的复杂性?我已经对它进行了搜索,并对堆栈进行了一些研究*,但是仍然没有线索下一步做什么.在我看来有几种可能的方法来解决它: >使用类SQL数据结构: { {'name': 'United Kingdom','unique_id': 1},{'name': 'England','unique_id': 2,'parents': [1]},{'name': 'Merseyside','unique_id': 3,'parents': [2]},{'name': 'Lancashire','unique_id': 4,{'name': 'Liverpool','unique_id': 5,'parents': [3,4]},} >使用一些参考的树结构: { {'name': 'United Kingdom','unique_id': 1 {'name': 'England','unique_id': 2] {'name': 'Merseyside','unique_id': 3] {'name': 'Liverpool','alternate_parents': [4]},},'unique_id': 4},} >使用没有引用(一对多)的树结构,并手动添加“备用父”标签到文档中: { {'name': 'United Kingdom','unique_id': 5},} >坚持使用SQL. 请给我这方面的建议.我是一个新任的NoSQL(目前我没有设计这样的数据库),所以有一个真正的设计问题给我. 我是新的堆栈*所以随时纠正我,如果我做错了这个帖子:)谢谢! 编辑 但是,如果您的应用程序不需要文档集合,则@Philipp建议的图形数据库(基于关系而不是文档)可能是最佳解决方案. 解决方法首先,如果您不熟悉基本原理,那么在NoSQL和SQL数据库之间进行挑选是很困难的.如果这是您存储的唯一数据,请使用关系(SQL).如果有更多的数据(我假设),它需要更多的交织模式,坚持使用NoSQL手.我会采取这样的关系路线,以防止它变得太复杂…开始几个集合;一个用于国家,地区等.不要在NoSQL数据库中不要使用关系型(SQL)类型模式;大多数时候他们是最好的解决方案. 然后,在每个子组中,有一个字段命名父. 例如: { {'name': 'United Kingdom'},{'name': 'United States'} } { {'name': 'England','parent': 'United Kingdom'},{'name': 'California','parent': 'United States'} } 这样,你的数据集就不会那么嵌套,所以返回的数据是无法管理的.那么你可以轻松抓住国家和相应的地区…等等. 祝你好运! 编辑:回答OP的问题: (首先,我建议MongoDB – 这是一个很好的解决方案.) >因为当你开始使用MongoDB时,你会发现它将数据并排存储在硬盘上.如果你编辑这样一个巨大的记录,它很可能被推到磁盘的背面,使您的硬盘驱动器类似于瑞士奶酪.一旦达到这个目的,您将不得不进行修复以再次凝结.此外,这样,数据在应用程序中更容易分离,如果需要对数据执行某些操作,则不必将其应用于整个对象.我假设你将有一个大的数据集,因为世界上有许多不同的地点. { { 'name': 'England,'parent': { 1: 1,568: 1 } } } 所以这样你可以使用你的索引的想法,并找到db.region.$.568 = 1 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |