需要有关数据存储区选择的建议

时间:2018-09-30 15:39:06

标签: architecture datastore system-design

要求

必须拥有

  • 水平可扩展。
  • 快速排序二级索引。
  • 对一组文档进行原子更新(或通过以下方式模拟原子更新 表级别的版本控制)。一组非常重要的 最终用户将文档(来自过滤器)视为已更新 一起。
  • 应该易于维护很多表。每个表将 存储一个项目类别,每个类别都有一个单独的架构。
  • 应该很容易添加一个复合索引。过滤条件可以 随时更改(未预先定义过滤条件的查询)。会更好 如果数据存储区允许对所有可能的组合进行快速过滤 列数(默认情况下包含所有可能的复合索引)。 过滤条件可以等于或范围查询。

可选

  • 在上述提到的对一组文档进行原子更新时,通常只更新两列或三列。如果数据存储支持部分文档更新而无需重新索引整个文档,那就太好了。

不需要

  • 高可用性
  • 强一致性(最终一致性有效)
  • 高写吞吐量或低写延迟

查询模式

{
  "item_id": "1234",
  "brand": "adidas",
  "average_price": 123,
  "rate_of_sale": 123,
  "visual information": {
    "img_url": "http://imgsdsd",
    "color": "red"
  }
}
  • 获取价格在100到200之间的所有adidas品牌商品并进行筛选 根据rate_of_sales设置。
  • 根据第二天更新所有商品rate_of_sales 在csv上。它应该是原子更新或应该创建一个 新表,使用新ros复制数据并删除旧表,然后 使应用程序指向新表。

1 个答案:

答案 0 :(得分:1)

由于您需要水平可伸缩性,因此像Mysql这样的事务性存储将不起作用。

由于需要复合索引,因此可以消除Redis,Aerospike等键值存储以及HBase,Cassandra等扩展键值。

如果您有很多综合指数,则MongodB效率不高。

弹性搜索或Solr支持所有用例(原子批量更新除外),但是如果您要更新整个索引,则可以使用别名来解决。

Solr通常可以有效地多次更新文档。

如果复合索引的数量不多,您也可以考虑使用Mysql并进行应用程序级分片。

https://db-engines.com/en/ranking是比较数据存储的好网站。