NoSql初学者老兄。数据设计和关系

时间:2015-06-02 08:09:47

标签: database nosql

我对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重复了很多信息。什么是最好的策略?

感谢。

1 个答案:

答案 0 :(得分:1)

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

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

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