我想为我的带有NoSQL数据库的node.js应用程序实现分类结构(地理术语).我有一个与MySQL类似的分类结构,但现在是时候向前推进并学习新东西,所以我决定尝试不同的方法并使用NoSQL(面向文档)来测试我的测试应用程序.分类结构很简单 - 有五个不同的级别:国家(即英国)→地区(英格兰)→县(默西塞德郡)→城市/城镇/村庄(利物浦)→城市的一部分(Toxteth).
显而易见的选择是使用树木结构,但魔鬼在细节 - 历史上一些城市和城镇属于其他县.这个想法是用那些术语来标记出生在某些城市或城镇的人,然后用地理标记过滤它们,所以我必须尊重利物浦或曼彻斯特(以及其他人)在某些人出生时属于兰开夏郡的事实. .否则,任何用户使用我的地理过滤器获得的结果都将是错误的.
例如:约翰·多伊于1957年出生于布莱克本(兰开夏郡).保罗·布朗1960年出生于利物浦(兰开夏郡,现为默西塞德郡).Georgia Doe(nee Jones)5年后出生在威勒尔(柴郡,现在的默西塞德郡).他们的儿子林戈于1982年出生于利物浦(默西塞德郡).
约翰是兰开斯特出生的,保罗是兰开斯特和梅西大学,格鲁吉亚同时来自柴郡和默西塞德郡,林戈来自默西塞德郡.所以当我按县搜索时,应该对它们进行相应的分类.但是,随着国家现代结构的简单一对多结构,他们永远不会被过滤掉.
如何使用NoSQL(首先是面向文档的)解决方案来实现集合的复杂性?我用Google搜索并对堆栈进行了一些研究*但仍然不知道下一步该做什么.在我看来,有几种可能的解决方法:
使用类似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, 'parents': [2]},
{'name': 'Liverpool', 'unique_id': 5, 'parents': [3, 4]},
}
Run Code Online (Sandbox Code Playgroud)使用树结构和一些引用:
{
{'name': 'United Kingdom', 'unique_id': 1
{'name': 'England', 'unique_id': 2]
{'name': 'Merseyside', 'unique_id': 3]
{'name': 'Liverpool', 'unique_id': 5, 'alternate_parents': [4]},
},
{'name': 'Lancashire', 'unique_id': 4},
},
},
}
Run Code Online (Sandbox Code Playgroud)使用没有引用的树结构(一对多)并手动将"alternate parent"标记添加到文档中:
{
{'name': …Run Code Online (Sandbox Code Playgroud)database-design many-to-many document-oriented-db taxonomy nosql