Google Spreadsheets替代方案的数据库选择和设计

时间:2014-09-15 14:31:42

标签: database database-design

我们正在为我们的客户构建一个电子表格Web应用程序。他们可以上传任何csv(20 MB +),然后对数据执行操作(如下所列)。数据高度非结构化

在过去的几个月里,我们尝试了几种架构:

  1. 最初,我们以2d数组格式存储整个网格,例如[{a:' b',x:' y'},{a:' e'}]在PostGreSQL的JSON数据类型中。但是,任何更新的单元格都需要将整个CSV存储在数据库中。这使得应用程序非常慢。

  2. 接下来,我们转移到了MongoDB。这提高了性能,但我们仍然遇到性能和可伸缩性问题。以下是我们的结构。

  3. 我们目前的数据库设计:
    PostgreSql结构:
    表 - 数据集
    id,名称,描述等......

    Mongo结构:
    第1行 _id,column1:value1,column2:value2,_data_set_id = datasets.id
    第2行 _id,column1:value1,column2:value2,_data_set_id = datasets.id
    ......等等 此外,我们在_data_set_id键上有一个mongo索引,以支持以下类型的更快查询。

    ( db.coll.find({_data_set_id: xyz}) )
    

    我们还使用来自第三方供应商的托管mongo,负责分片,备份,正常运行时间等(我们没有开发人员)

    对数据的操作有两种类型:

    1. 行操作,例如添加或删除行
    2. 列操作,例如添加或删除列
      数据上的大多数操作都是列级操作,即只更新每行中的列。
    3. 我们已经优化到mongo在行数少于10k的数据集中工作得相当好的程度。但是,除此之外,我们无法扩展。我们目前在Mongo有大约25GB的数据,在接下来的几周内我们将达到50GB。 我们当前的产品是原型,现在,我们正在重新考虑我们的数据库架构,以便更好地扩展。

      我们数据库的最关键要求是:

      1. 快速读写。
      2. 列查询和更新。
      3. 更新单个单元格(即行x,列y)值。
      4. 所以,

        1. Mongo是否是此用例的正确数据库?
        2. 如果是,我们还可以做什么(索引,分片除外)来缩放Mongo?
        3. P.S
          我们确实意识到我们只能实现CAP中的2个,并且还经历了Cassandra vs Mongodb vs Couchdb vs Redis 我们还在评估Couchdb(主 - 主复制,MVCC等但没有动态查询),Cassandra(querying on unstructured data is not possible)和HBase(ColumnStore)作为替代方案。

1 个答案:

答案 0 :(得分:0)

我强烈怀疑您的数据库实际上没有分片。如果您支付分片费用,您可能无法获得好处。

然后您可以按索引进行分片,这样可以节省您的时间,因为数据最终会存储在一个或两个分片服务器上,然后这些服务器可以根据您的_data_set_id _更快地响应。

尝试输入:

sh.status()

这应该是您的数据库的分布情况。它可能只在一个碎片上。

在设置分片之前,请仔细阅读这些位。在不重建整个系列的情况下重做分片非常困难!

http://docs.mongodb.org/manual/tutorial/choose-a-shard-key/