小编Iva*_*pov的帖子

与NoSQL数据库的多对多关系

我想为我的带有NoSQL数据库的node.js应用程序实现分类结构(地理术语).我有一个与MySQL类似的分类结构,但现在是时候向前推进并学习新东西,所以我决定尝试不同的方法并使用NoSQL(面向文档)来测试我的测试应用程序.分类结构很简单 - 有五个不同的级别:国家(英国)→地区(英格兰)→县(默西塞德郡)→城市/城镇/村庄(利物浦)→城市的一部分(Toxteth).

显而易见的选择是使用树木结构,但魔鬼在细节 - 历史上一些城市和城镇属于其他县.这个想法是用那些术语来标记出生在某些城市或城镇的人,然后用地理标记过滤它们,所以我必须尊重利物浦或曼彻斯特(以及其他人)在某些人出生时属于兰开夏郡的事实. .否则,任何用户使用我的地理过滤器获得的结果都将是错误的.

例如:约翰·多伊于1957年出生于布莱克本(兰开夏郡).保罗·布朗1960年出生于利物浦(兰开夏郡,现为默西塞德郡).Georgia Doe(nee Jones)5年后出生在威勒尔(柴郡,现在的默西塞德郡).他们的儿子林戈于1982年出生于利物浦(默西塞德郡).

约翰是兰开斯特出生的,保罗是兰开斯特和梅西大学,格鲁吉亚同时来自柴郡和默西塞德郡,林戈来自默西塞德郡.所以当我按县搜索时,应该对它们进行相应的分类.但是,随着国家现代结构的简单一对多结构,他们永远不会被过滤掉.

如何使用NoSQL(首先是面向文档的)解决方案来实现集合的复杂性?我用Google搜索并对堆栈进行了一些研究*但仍然不知道下一步该做什么.在我看来,有几种可能的解决方法:

  1. 使用类似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)
  2. 使用树结构和一些引用:

    {    
        {'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)
  3. 使用没有引用的树结构(一对多)并手动将"alternate parent"标记添加到文档中:

    {    
        {'name': …
    Run Code Online (Sandbox Code Playgroud)

database-design many-to-many document-oriented-db taxonomy nosql

20
推荐指数
2
解决办法
2万
查看次数