【问题标题】:updating and modeling nosql record更新和建模nosql记录
【发布时间】:2021-11-16 05:49:15
【问题描述】:

所以在传统数据库中,我可能有 2 个表,例如用户、公司

id username companyid email
1 j23 1 something@gmail.com
2 fj222 1 james@aol.com
id ownerid company_name
1 1 A Really boring company

也就是说,用户 1 和 2 是公司 1(一个非常无聊的公司)的一部分,而用户 1 是这家公司的所有者。

我可以轻松地在 MySQL 或 Postgresql 中发出更新语句来更新公司名称。

但是我如何从 NoSQL 的角度对相同的数据进行建模,比如 Dynamodb 或 Mongodb?

每个用户记录(NoSQL 中的文档)是否会包含相同的公司表数据(id、ownerid(或者所有者是真/假和公司名称)?我不清楚如何更新包含此数据的所有用户的记录那么如果需要更新公司名称。

【问题讨论】:

    标签: mongodb nosql amazon-dynamodb


    【解决方案1】:

    如果您想在每个字段中将公司对象保存为 JSON(出于性能原因),确实,您必须更新很多行。

    但实现这一点的最佳方法是在 MySQL 中使用与上述类似的结构。 NoSql 架构很大程度上取决于您将要进行的查询。

    例如,上面的架构非常适合:

    • 通过用户名及其公司名称查找特定用户。首先,您需要通过username 查询User(您可以添加索引),获取companyId 并在Company 上再次查询以获取名称。
    • 假设公司名称经常更改
    • 在这种情况下,公司名称更新很容易。要执行读取查询,您需要 2 个查询来获得结果(但它们应该执行得很快)

    嵌入式公司 JSON 更适用于:

    • 查找来自特定城市的所有用户并显示他们的公司名称
    • 假设公司名称很少更改
    • 在这种情况下,我们不能使用“关系”方法,因为我们将执行 1 次查询以通过 city 获取 Users,然后对找到的所有用户进行另一次查询以获取公司名称
    • 使用嵌入式方法,我们只需要 1 个查询
    • 要更新公司名称,需要进行完整(昂贵的)扫描,但如果很少这样做应该没问题

    如果公司名称经常更改,我想按城市获取用户怎么办?

    • 这变得很棘手,NoSQL 不是 SQL 的替代品,它有它的缺点。解决方案可能是依赖于平台的功能(来自 mongo、dynamodb、firestore 等)、上面的附加层(elasticSearch)或根本没有解决方案(考虑不使用键值 NoSQL)

    【讨论】:

      【解决方案2】:

      取决于用于处理 NoSQL 对象/文档的编程语言,您有各种 ORM 库来为您的模式建模。例如。对于 MongoDB 和 JS/Typescript,我推荐 Mongoose 及其 子文档。以下是关于它的更多信息:

      https://mongoosejs.com/docs/subdocs.html

      【讨论】:

        猜你喜欢
        • 2013-03-30
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-25
        • 1970-01-01
        相关资源
        最近更新 更多