Mongodb 将我的思维从关系模型转变为文档存储(理论)

Mongodb 将我的思维从关系模型转变为文档存储(理论),mongodb,database-design,database-schema,database,Mongodb,Database Design,Database Schema,Database,我仍在试图弄清楚像Mongo这样的东西在野外是如何被使用的 有人能给我解释一下吗(我知道这很简单) 好的,假设我有一组用户,他们有一组服务,在SQL数据库中,他们将存储如下: 用户表 | user_id | name | address | |---------|------|---------| | 1 | Zen | 1 a St | |---------|------|---------| 服务 | service_id | user_id | service_type

我仍在试图弄清楚像Mongo这样的东西在野外是如何被使用的

有人能给我解释一下吗(我知道这很简单)

好的,假设我有一组用户,他们有一组服务,在SQL数据库中,他们将存储如下:

用户表

| user_id | name | address |
|---------|------|---------|
| 1       | Zen  | 1 a St  |
|---------|------|---------|
服务

| service_id | user_id | service_type | cost |
|------------|---------|--------------|------|
| 1          | 1       | hosting      | 50   |
|------------|---------|--------------|------|
在Mongo中,用户会将其存储在用户中吗?所以它更像是一个用对象来编程的人

e、 g

如果是这样的话,是否有必要拥有一个指向值的“指针”(在多个“事物”可能“拥有”另一个“事物”的情况下,或者数据的继承人关系需要这样做

对于来自SQL背景的Mongo,人们会如何处理这个问题


谢谢

注意:我从未使用过Mongo,但我已经开发了几个NoSQL解决方案

在Redis和CouchDB中,我都使用前缀后缀样式的命名约定来存储对象。

服务===
services.userid.1
services.userid.2

用户==
users.userid.1
users.userid.2


为用户查找服务现在应该是轻而易举的事了。=>services.user-name.wild-card

注意:我从未使用过Mongo,但我已经开发了几个NoSQL解决方案

在Redis和CouchDB中,我都使用前缀后缀样式的命名约定来存储对象。

服务===
services.userid.1
services.userid.2

用户==
users.userid.1
users.userid.2


为用户查找服务现在应该是轻而易举的事了。=>services.user-name.wild-card

MongoDB中的有效数据建模遵循您的应用程序要求和常见用例。您可以将文档视为类似于序列化对象;MongoDB文档格式支持丰富的数据结构,包括嵌套

首先要考虑你的应用程序用例,以规划你最理想的查询和操作数据的方式。你不必在MunGDB中预先声明你的模式,这对原型是有帮助的。MunGDB中的模式通常更类似于一个数据仓库,其中一些数据被有意地反义化为一个数据仓库。作废联接并提高性能。事实上,MongoDB不支持联接或子查询:)

对于关系,如果您使用的是对象文档模型或数据映射器,还可能需要考虑一些因素。。其中许多都是关系的提供者助手

传统的选择是是否对相关数据进行分析

例如,您仍然可以拥有
用户
集合和
服务
集合:

  • 如果用户有许多服务,您可能会将其服务列表作为数组嵌入到用户文档中

  • 用户的服务可能包括基本的细节,如serviceID和name;serviceID将是唯一的ID,可用于在服务集合中查找完整的服务定义。这将链接到服务集合。注意MongoDB服务器不支持连接,因此如果您想查找用户和每个服务的完整详细信息,则需要多次查询

相关阅读:


MongoDB中的有效数据建模遵循您的应用程序要求和常见用例。您可以认为文档类似于序列化对象;MongoDB文档格式支持丰富的数据结构,包括嵌套

首先考虑你的应用程序用例,以便规划你最理想的查询和操作数据的方式。您不必在MongoDB中预先声明您的模式,这对原型设计很有帮助。MongoDB中的模式通常更类似于数据仓库,其中一些数据被有意地非规范化,以避免连接并提高性能。事实上,MongoDB不支持联接或子查询:)

对于关系,如果您使用的是对象文档模型或数据映射器,还可能需要考虑一些因素。。其中许多都是关系的提供者助手

传统的选择是是否对相关数据进行分析

例如,您仍然可以拥有
用户
集合和
服务
集合:

  • 如果用户有许多服务,您可能会将其服务列表作为数组嵌入到用户文档中

  • 用户的服务可能包括基本的细节,如serviceID和name;serviceID将是唯一的ID,可用于在服务集合中查找完整的服务定义。这将链接到服务集合。注意MongoDB服务器不支持连接,因此如果您想查找用户和每个服务的完整详细信息,则需要多次查询

相关阅读:


    • 建模可以或多或少地抽象。在SQL世界中,表几乎是可以使用的最低抽象级别,并且仍然将数据连接到底层主题。更高层次的抽象是关系建模和ER建模。“更高”不是“更好”的暗号。每一个抽象层次都通过美化其他特征来突出某些特征。什么级别对您的目的有用取决于您试图更清楚地看到的内容

      另一个回答提到Mongo支持嵌套。嵌套可以是编码数据项之间的层次关系的一种方式,而无需强加许多上层结构。但在不了解Mongo的情况下,我无法告诉您这是否就是Mongo的架构师为用户提供嵌套的原因

      等级关系可以是有益的,也可以是阻碍性的,这取决于你想做什么。例如,如果您认识该用户,并且正在尝试查找所有用户
      User: 1
          Name: Zen
          Address: 1 a St
          Services:
              service 1
                   type: hosting
                   cost: 50