【问题标题】:sql text field vs flat file vs nosql document storesql 文本字段 vs 平面文件 vs nosql 文档存储
【发布时间】:2012-01-12 23:49:39
【问题描述】:

我计划创建一个 SQL 事实表,其中包含一个我不希望对其进行索引的文本字段(我只会读出数据并且很少更新它)。我认为这个表可能会变得很大,主要是由于这个文本字段。我的数据库中的其余数据确实有意义,但我相信如果我存储指向平面文件的指针(其中每个指针指向存储在 S3 之类的不同文本文件中的不同文本文件),我可以更轻松、更便宜地进行扩展而不是使用文本字段。

似乎越来越受欢迎的替代方案是完全基于 NoSQL 文档的解决方案(例如 CouchDB、MongoDB 等)。维护/成本)在简单地使用 SQL 文本字段、使用指向平面文件的指针还是在 NoSQL 文档存储的上下文中完全重新考虑整个系统之间?

【问题讨论】:

  • 这是一个非常复杂的问题。 “相当大” 的概念非常模糊。您是在谈论 TB 级数据还是 PB 级数据?增长率是多少?什么查询需要快速,什么可以接受的慢?
  • 此特定文本数据预计约为 50 TB。预计在峰值负载期间将增长约 500 kb/秒。理想情况下,所有 select 语句都很快(它们将被预定义,因为只有 Web 服务才能访问数据库),而插入和更新可能会很慢。
  • 如果要在32位系统上使用MongoDB,首先要考虑的是只能存储2GB的数据。 MongoDB 生产商表示,由于大多数 PC 将是 64 位,因此问题将很快得到解决,因此他们不想更改程序以允许 32 位 PC 使用超过 2GB 的内存。至少我是这么读的。所以这是第一个问题,但我认为 CouchDB 没有这个问题。
  • MongoDB 32 位系统支持仅适用于开发人员。生产系统总是在 64 位系统上运行,这已经是很长时间的标准了。要求背后的原因是因为 MongoDB 被设计为利用内存映射文件。

标签: sql mongodb text flat-file nosql


【解决方案1】:

最好的方法是对普通(非文本)数据使用关系数据库,并将大型(文本)数据保存在“其他地方”,这样可以比关系数据库更好地处理大型数据。

首先,让我们讨论一下为什么将大数据保存在关系数据库中是一个糟糕的想法:'

  • 行大小变得更长,因此读取具有目标行的磁盘页面所需的 I/O 会膨胀
  • 备份大小,更重要的是,备份扩大到可以削弱 DBA 任务甚至使系统脱机的程度(然后关闭备份,然后磁盘出现故障,哎呀)
  • 您通常不需要搜索文本,因此无需将其保存在数据库中
  • 关系数据库和库/驱动程序通常不擅长处理异常大的数据,而且处理数据的方式通常是特定于供应商的,这使得任何解决方案都不可移植

您对“其他地方”的选择范围很广,但包括:

  • Cassandra、MongoDB 等大型数据存储软件
  • Lucene 等 NoSQL 数据库
  • 文件系统

做最简单可行的事情 - 只要您对以下方面进行需求计算,它们都是有效的:

  • 峰值写入性能
  • 峰值读取性能
  • 长期存储量

另一个提示:不要在关系数据库中存储关于文本的任何内容。相反,使用关系数据库行的 id 命名/索引文本。这样一来,如果您更改您的实现,您就不必重新调整您的数据模型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 2017-04-28
    • 2023-03-27
    • 2016-04-24
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多