数据库设计 – 与NoSQL数据库的多对多关系

前端之家收集整理的这篇文章主要介绍了数据库设计 – 与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(目前我没有设计这样的数据库),所以有一个真正的设计问题给我.

我是新的堆栈*所以随时纠正我,如果我做错了这个帖子:)谢谢!

编辑
我选择了@Jonathan答案作为解决方案.我认为它适合我的需要(将有其他文档存储在我的数据库中,并用这些术语标记它们),特别是使用@Valentyn建议的mapReduce功能.

但是,如果您的应用程序不需要文档集合,则@Philipp建议的图形数据库(基于关系而不是文档)可能是最佳解决方案.

解决方法

首先,如果您不熟悉基本原理,那么在Nosqlsql数据库之间进行挑选是很困难的.如果这是您存储的唯一数据,请使用关系(sql).如果有更多的数据(我假设),它需要更多的交织模式,坚持使用Nosql手.

我会采取这样的关系路线,以防止它变得太复杂…开始几个集合;一个用于国家,地区等.不要在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

原文链接:https://www.f2er.com/mssql/82046.html

猜你在找的MsSQL相关文章