【问题标题】:Is there any downside to flatten data model schema in NOSQL Mongodb?在 NOSQL Mongodb 中扁平化数据模型模式有什么缺点吗?
【发布时间】:2019-10-05 12:37:18
【问题描述】:

我正在使用 NodeJS 和 typescript,并且我正在为我的函数进行输入以实现自动完成。

目前我有一个这样的用户实体架构

interface User {
  "_id": string
  "coach": {
    "businessCard": string
  }
  "firstname": string
}

我正在为 coach 属性使用嵌套对象,但我的问题是:这样做有什么意义,在幕后 MongoDB 创建另一个以一对一关系引用的对象。

  1. 这可能会降低性能
  2. 我在键入函数以限制可以在 typescript 中定位的字段时遇到问题

让我们看一个例子:

await this.client.collection<User>('User').findOneAndUpdate(
     { _id: new ObjectID(userId) },
     {"coach.businessCard": "50"},
);

将更新嵌套对象。

但是这种语法使用

interface User {
  "_id": string
  "coach.businessCard": string
  "firstname": string
}

不同的是,现在我可以统一使用一种匹配点符号的语法。


那么,与使用扁平化的第二个符号相比,使用我给出的第一个符号有什么优势?

最好的问候

【问题讨论】:

    标签: database mongodb typescript architecture nosql


    【解决方案1】:

    使用嵌套文档一对一关系的优点如下:

    1. 表示数据字段之间的联系。例如:要保存用户地址,我们需要获取多个字段,例如:

     -> Address line 1   
     -> Address line 2   
     -> Locality    
     -> Region    
     -> Postcode    
     -> Building    
     -> Sub-Building    
     -> etc.
    

    通过一对一关系,我们可以将相关信息绑定在一个单元中,如下所示:

    address: {
         Address line 1: String ,
         Address line 2: String,    
         Locality: String,    
         Region: String,    
         Postcode: Number,        
         Building: Number,
         Sub-Building: Number,
         etc: String
    } 
    

    2. 从数据库中检索此类信息很有帮助。例如:

    -> 要获取完整的地址详细信息,我可以用一个键进行投影。

    db.collection.find({},{ address: 1} )
    

    -> 要获取特定的地址字段,我可以在上面进行投影,如下所示:

    db.collection.find({},{ 'address.Locality': 1, 'address.Region': 1} )
    

    【讨论】:

    • - 好的,第二个参数,这显然很好:) - 首先,我承认这更具可读性,但是通过良好的命名约定前缀,我们可以避免这种情况,不是吗?感谢您的回答:) 将查看是否有人有更多我们可能错过的信息,并最终解决我的打字问题:)
    猜你喜欢
    • 2017-10-31
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2019-09-15
    • 2011-01-21
    • 1970-01-01
    • 2011-06-29
    相关资源
    最近更新 更多