明显的选择是使用树结构,但恶魔在细节上 – 历史上一些城镇属于其他县.这个想法是用这些条款来标记在某些城市或城镇出生的人,然后用地理标签来过滤它们,所以我必须尊重利物浦或曼彻斯特(等)在当时有人出生的时候是兰开夏郡的一部分.否则任何用户使用我的地理过滤器的结果将不正确.
例如: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},}
请给我这方面的建议.我是一个新任的Nosql(目前我没有设计这样的数据库),所以有一个真正的设计问题给我.
我是新的堆栈*所以随时纠正我,如果我做错了这个帖子:)谢谢!
编辑
我选择了@Jonathan答案作为解决方案.我认为它适合我的需要(将有其他文档存储在我的数据库中,并用这些术语标记它们),特别是使用@Valentyn建议的mapReduce功能.
解决方法
我会采取这样的关系路线,以防止它变得太复杂…开始几个集合;一个用于国家,地区等.不要在Nosql数据库中不要使用关系型(sql)类型模式;大多数时候他们是最好的解决方案.
然后,在每个子组中,有一个字段命名父.
例如:
{ {'name': 'United Kingdom'},{'name': 'United States'} } { {'name': 'England','parent': 'United Kingdom'},{'name': 'California','parent': 'United States'} }
这样,你的数据集就不会那么嵌套,所以返回的数据是无法管理的.那么你可以轻松抓住国家和相应的地区…等等.
祝你好运!
编辑:回答OP的问题:
(首先,我建议MongoDB – 这是一个很好的解决方案.)
>因为当你开始使用MongoDB时,你会发现它将数据并排存储在硬盘上.如果你编辑这样一个巨大的记录,它很可能被推到磁盘的背面,使您的硬盘驱动器类似于瑞士奶酪.一旦达到这个目的,您将不得不进行修复以再次凝结.此外,这样,数据在应用程序中更容易分离,如果需要对数据执行某些操作,则不必将其应用于整个对象.我假设你将有一个大的数据集,因为世界上有许多不同的地点.
>别担心这种事情太多了.如果您计划更改名称,您可以使用ID作为父母,并将孩子与ID相匹配.我这样做是因为我假设你不需要更改位置数据库.
>而不是一个数组,我将使用一个嵌套文档来存储多个父母.这样,它可以更容易地查询和索引.我会用以下方法:
{ { 'name': 'England,'parent': { 1: 1,568: 1 } } }
所以这样你可以使用你的索引的想法,并找到db.region.$.568 = 1