【问题标题】:Which database(s) should I use for predominantly Write once/Read Many operations?我应该主要使用哪个数据库进行一次写入/多次读取操作?
【发布时间】:2010-08-17 11:39:58
【问题描述】:

我正在构建一个需要查询大量数据的应用程序,这些数据只写一次就不会再改变了。我应该使用 MySQL 还是应该使用 SimpleDB 或 BigTable 之类的东西? (我需要写一次,读多次)

谢谢。

编辑:我想使用 Heroku,对我来说大超过 5MB。 “千行”占用超过 5MB。这就是为什么我想知道是否应该使用 CouchDB、SimpleDB 或 MongoDB,以免支付 Heroku 收取的 15 美元。克服这个问题的建议?谢谢大家的cmets!

【问题讨论】:

  • 你想加入吗?是否要通过 UID 以外的属性检索数据?性能有多重要? “大量数据”是指多行的大集合还是单行的多次读取?
  • 您对性能/耐用性的期望是什么?分片?
  • 您忘记了最重要的信息:数据的形状。如果您的数据不是关系数据,那么不管您的性能要求是什么,MySQL 都是不可能的。如果你的数据关系的,那么 SimpleDB 和 BigTable 就不可能了。你有关系数据吗?图表数据?半结构化文档数据?分层数据?本体/三重/RDF数据?我也同意@FractalizeR:你需要A、C、I、D吗?如果是,您需要多少或多少?你什么时候需要它?需求总是相同还是因查询而异?
  • "大量数据" = 数以千计的行可以一次读取很多次。数据是相关的。编辑:我将有一个包含数千个对 S3 文件的引用的表,每个用户都可以创建这些文件的“组合”。因此,每个用户的投资组合中都将拥有无限的文件。
  • 数千行 = 少量数据。所以,我认为任何数据库都可以。如果说数百万,那么你需要谨慎选择。

标签: database database-design relational-database non-relational-database


【解决方案1】:

“大量数据”是什么意思?数千、数百万、数十亿行?每行有多少列?你会使用很多连接还是简单的选择?

如果您的表很简单或者您需要使用复杂的 JOIN,我会选择您熟悉的任何 SQL。

如果您的结构很复杂并且面向文档的数据库适合您的需求,我会选择 MongoDB(首选)或 CouchDB。

编辑:根据您的评论 - 数千行并不多。使用您最喜欢的数据库并根据需要设置尽可能多的缓存(阅读有关必要缓存量的更多信息或开始一个新主题)。或者使用 Memcached,但我建议使用数据库缓存,因为它对您来说也很高效且无痛。好运啊!

【讨论】:

  • 数千行。每行 20 列。谢谢。
  • 这还不算大。严重地。任何数据库引擎都将满足您的需要。甚至是免费的数据库引擎。
  • @Tiago:如果您想将heroku.com 用作网络托管,并且他们对每个数据库收取 15 美元的费用,那么您只需做出决定并支付费用或选择其他托管。服务(如托管)花钱是绝对正常的。
  • 他们免费提供 5MB 和 1GB CouchDB。
  • @Tiago:您应该根据自己的需要选择合适的技术,预算并不那么重要,尤其是在您的情况下 - 每月 15 美元是几个汉堡的价格。或者,如果你想让我说 - 去购买 1GB 免费的 CouchDB,如果这会让你开心,那就去吧!
【解决方案2】:

比您选择的数据库引擎更重要的是您的表结构。您应该阅读 OLAP 数据库结构。另一个考虑因素是您编写的语言,确保对您要使用的数据库的 API 有良好的支持。 CouchDB 会很好,因为由于缺少关系/事务,它的开销非常低。

【讨论】:

  • 由于您在操作期间不使用写入,因此不执行写入的效率有多高并不重要 :-)。然而,由于它不执行事务或管理关系,与其他更复杂的数据库系统(如 MySQL)相比,开销更少。它非常简单,在这种情况下这是一件好事。
  • 不要为管理 5MB 数据库的数据库系统付费(小!)。使用 CouchDB 并完成它,或者坦率地说使用任何东西,你不会注意到差异。阅读此内容,尤其是引号:en.wikipedia.org/wiki/Program_optimization#When_to_optimize
  • 谢谢! CouchDB 的一切都好吗?甚至用于存储用户名/密码?我一定会考虑的!
  • 是的,没关系。您不应该存储明文密码,而是加密哈希:aspheute.com/english/20040105.asp
【解决方案3】:

对于“一次写入,多次读取”,非规范化数据库(不会浪费周期来进行连接等)是一个不错的选择。

因此,您应该设计您的表,以便这些读取必须执行最少数量的 I/O 和连接。您可以对任何数据库执行此操作。重要的是表的结构。

AFAIK、SimpleDB 和 BigTable 是分布式数据库,如果您的用户分布在地理上(从而绕过网络延迟),它们可以提供非常好的查询速度。如果 I/O 延迟不是瓶颈,它们将不会提供太多优势。

【讨论】:

    【解决方案4】:

    您拥有的数据量很小。任何 DBMS 都可以处理几千行。我建议您首先查看一个流行的 SQL DBMS,例如您已经提到的 MySQL。您需要根据功能需求做出选择,而不是关心数据大小。

    【讨论】:

      【解决方案5】:

      对于这种小规模的用例来说,单独的数据库是多余的。只需将您的数据序列化为一个平面文件,然后将其读入您所用语言选择的地图数据结构中。

      【讨论】:

        【解决方案6】:

        我认为您应该使用非事务性和面向文档的数据库,例如 MongoDB 或 CouchDB。

        【讨论】:

        • 你能详细说明一下吗?
        猜你喜欢
        • 2012-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多