【问题标题】:NoSql beginner dude. Data design and relationshipsNoSql 初学者老兄。数据设计和关系
【发布时间】:2017-09-15 15:30:13
【问题描述】:

我对 NoSQL 概念有很多疑问。

我能理解 NoSQL 数据如何存储,但不明白如何推导出最佳方式以及如何分发数据。

例如,数据存储。 如何存储订单? 选项 A:

customers: [customer {data1, data2,..., orders: [{data1, products [{data1, data2, quantity,...}]}]

选项 B:

customer: [customer {data1, data2, Data3, ...}]
orders: [{customerId, data1, products [{data1, data2, quantity}]

选项 C:

customer: [customer {data1, data2, Data3, ...}]
products [{data1, data2, ...}]
orders: [{customerId, data1, products [{productId, quantity}]}]

B 和 C 选项有关系,但 A 重复了很多信息。最好的策略是什么?

谢谢。

【问题讨论】:

    标签: database nosql


    【解决方案1】:

    对于大多数 nosql 数据库(键值、列式和文档;图形数据库是完全独立的野兽),连接很昂贵——甚至可能需要在应用程序代码中实现。出于这个原因,最好对表进行非规范化,选项 A 优于选项 B 优于选项 C。

    有时这没有任何意义:有时一个数据足够大并且重复频率足够高以至于非规范化会占用过多的磁盘空间(这很便宜但肯定不是免费的),有时您需要最新最好的数据在这种情况下,非规范化可能不合适,因为更新可能需要很长时间才能传播,有时非规范化是过度的,因为您并不经常需要数据。在这种情况下,您的一些选择是:

    1. 如果数据很大并且经常重复,或者如果数据需要尽可能一致,或者如果您不经常需要数据,那么使用关系 - 这将比关系连接更昂贵因为它可能需要至少再往返一次数据库,但是如果您只有一两个关系和/或能够对大多数/所有关系进行批量查找,那么查找成本应该仍然讲道理。
    2. 如果您需要最新数据和/或如果数据经常更新,那么您可以执行一些操作,例如用缓存补充数据库,例如Redis。这看起来像:当您更新非规范化关系(例如products)时,您将新数据存储在缓存中;当您检索包含非规范化关系 (customers) 的记录时,您会检查缓存中是否有更新版本的数据;在将非规范化关系传播到所有记录后,将从缓存中删除数据。
    3. 如果您不经常需要数据,特别是如果您不经常进行批量查询,那么您可以使用许多 nosql 数据库支持的MapReduce 查询,通常采用HadoopSpark。请注意,如果您要做很​​多这样的事情,那么一定要选择一个支持它的数据库:副手,HBaseCassandra 将是不错的选择,而像 Riak 这样的一些数据库将支持MapReduce,但不会有特别好的实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-27
      • 2015-04-28
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 2019-01-20
      • 2014-03-15
      相关资源
      最近更新 更多