2

这更像是一个概念/数据库架构相关的问题。为了保持数据一致性,而不是 NoSQL 数据存储,我只是将 JSON 对象存储为 MySQL 中的字符串/文本。所以一个 MySQL 行看起来像这样

ID, TIME_STAMP, DATA

我会将 JSON 数据存储在 DATA 字段中。我不会更新任何行,而是添加带有当前时间戳的新行。因此,当我想要最新数据时,我只需获取具有 max(timestamp) 的行。我将 Tornado 与 Python MySQLDB 驱动程序一起用作我的主要后端应用程序。

我发现这种方法非常直截了当,不易出错。JSON 对象相当简单并且没有大量嵌套。

这种方法从根本上是错误的吗?在 MySQL 中将 JSON 数据存储为文本是否有任何问题,或者我应该使用基于文件系统的存储,例如 HDFS。请告诉我。

4

3 回答 3

8

您可能知道,MySQL 是一个关系数据库管理器。它被设计为用于数据通过键相互关联的方式,形成关系,然后可用于产生复杂的数据检索。您的方法在技术上可行(并且速度非常快),但如果您扩大范围的复杂性,可能会(根据我目前所见)大大削弱您利用所使用技术的可能性!

我建议您使用像 Redis 或 MongoDB 这样的数据库,因为它们是为文档存储而不是关系架构设计的。

也就是说,如果您发现该方法适用于您正在构建的内容,那就继续吧。如果您想为您的解决方案增加复杂性,您可能会遇到一些障碍,但无论哪种方式,您都会学到新的东西!祝你好运!

于 2013-07-15T10:16:40.660 回答
1

Pradeeb,为了帮助回答您需要分析您的用例的问题。你存储什么样的数据?对我来说,这将是决定性因素:每种技术都有其擅长的特定用例。

我认为可以安全地假设您使用 JSON,因为与传统的关系数据库相比,您的数据结构需要非常灵活的文档。Phil 指出,某些数据存储本身就支持此类数据结构,例如 MongoDB(他们称之为“二进制 JSON”或BSON )。这将为您提供改进的存储和/或改进的搜索功能。同样,该实用程序完全取决于您的用例。

如果您正在寻找诸如作业队列之类的东西,并且水平可扩展性不是问题,并且您只需要快速访问最新的,您可以使用 RedisDB,一种内存中的键值存储,它具有哈希(关联数组)数据类型和这类事情的清单。或者,由于您提到 HDFS 和水平可扩展性很可能是一个问题,我可以推荐使用 Apache ActiveMQ 或 RabbitMQ 等队列系统。

最后,如果您正在大量编写,并且您不受客户端限制,但您的数据存储是您的瓶颈:请查看分布式、灵活模式的数据存储,如 HBase 或 Cassandra。它们提供灵活的数据模式,经过大量写入优化,并且可以附加数据并按时间顺序保留,因此您可以有效地获取最新数据。

希望有帮助。

于 2013-07-15T13:49:49.733 回答
1

这不是问题。您还可以在现代 MySQL 中使用 memcached 存储引擎,这将是完美的。虽然我从未尝试过。

另一种方法是使用 memcached 作为缓存。将所有内容写入 memcached 和 mysql。当你去读取数据时,尝试从 memcached 读取。如果不存在,则从 mysql 中读取。这是减少数据库瓶颈的常用技术。

于 2013-07-15T14:04:23.403 回答