我想使用 NoSQL 数据库为我的 node.js 应用程序实现分类结构(地理术语)。我有一个与 MySQL 相似的分类结构,但现在是前进并学习新东西的时候了,所以我决定尝试不同的方法并为我的测试应用程序使用 NoSQL(面向文档)。分类结构很简单 - 有五个不同的级别:国家(即英国)→ 地区(英格兰)→ 县(默西塞德郡)→ 城市/城镇/村庄(利物浦)→ 城市的一部分(Toxteth)。
显而易见的选择是使用树形结构,但细节在于细节——历史上一些城镇属于其他县。这个想法是用这些术语标记出生在某些城市或城镇的人,然后用地理标签过滤他们,所以我必须尊重利物浦或曼彻斯特(以及其他)在某些人出生时是兰开夏郡的一部分这一事实. 否则,任何用户使用我的地理过滤器获得的结果都是不正确的。
示例:John Doe 于 1957 年出生在布莱克本(兰开夏郡)。保罗·布朗于 1960 年出生在利物浦(兰开夏郡,现为默西塞德郡)。乔治亚·多伊 (nee Jones) 5 年后出生在威勒尔(柴郡,现在的默西塞德郡)。他们的儿子林戈于 1982 年出生在利物浦(当时的默西塞德郡)。
约翰出生于兰开斯特,保罗是兰开斯特和默西塞德,乔治亚同时来自柴郡和默西塞德,林戈来自默西塞德。所以当我按县搜索时,它们应该相应地分类。但是,由于遵循国家现代结构的简单一对多结构,它们永远不会被过滤掉。
如何使用 NoSQL(首先是面向文档的)解决方案来实现尊重其结构复杂性的集合?我用谷歌搜索了它并对 stack* 进行了一些研究,但仍然不知道下一步该做什么。在我看来,有几种可能的方法可以解决它:
使用类似 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]}, }
使用带有一些引用的树结构:
{ {'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}, }, }, }
使用没有引用的树结构(一对多)并手动将“alternate parent”标签添加到文档中:
{ {'name': 'United Kingdom', 'unique_id': 1 {'name': 'England', 'unique_id': 2] {'name': 'Merseyside', 'unique_id': 3] {'name': 'Liverpool', 'unique_id': 5}, }, {'name': 'Lancashire', 'unique_id': 4}, }, }, }
坚持使用 SQL。
- 尝试实现无数据库分类。
请给我关于这件事的建议。我是任何 NoSQL 的新手(目前我没有设计过这样的数据库),所以对我来说有一个真正的设计问题。
而且我是堆栈的新手*,所以如果我在这篇文章中做错了什么,请随时纠正我:) 谢谢!
编辑 我选择@Jonathan 回答作为解决方案。我认为它更适合我的需求(将有其他文档存储在我的数据库中并用这些术语标记它们),尤其是 @Valentyn 建议的 mapReduce 功能。
但是,如果您的应用程序不需要文档集合,@Philipp 建议的图形数据库(基于关系而不是文档)可能是最好的解决方案。