我们可以使用 JSON 作为数据库吗?

Posted

技术标签:

【中文标题】我们可以使用 JSON 作为数据库吗?【英文标题】:can we use JSON as a database? 【发布时间】:2012-12-03 16:10:52 【问题描述】:

我正在寻找快速高效的数据存储来构建我的基于 php 的网站。我知道mysql。我可以在我的服务器根目录中使用 JSON 文件而不是 MySQL 数据库吗?如果是,最好的方法是什么?

【问题讨论】:

Mongo DB?这有点像 JSON 数据库... LDAP 可以很好地映射到其数据层次结构中的 JSON。 我在问我可以使用根目录中的 .json 文件来存储我的数据 不使用任何数据库 定义“快速高效的数据存储”,然后您定义“*基于系统的需求”,而不是您拥有“花哨的”数据库层”。不要犯那个错误。大多数业务需求从 D 表或 NoSQL 方法中获得的收益很少,因为他们的数据问题不是这样组织的。 【参考方案1】:

您可以使用任何单个文件,包括 JSON 文件,如下所示:

以某种方式锁定它(google PHP 文件锁定,可能就像在文件打开函数中添加参数或将函数名称更改为锁定版本一样简单)。

从文件中读取数据并解析为内部数据结构。

可选择修改内部数据结构中的数据。

如果您修改了数据,请将文件截断为 0 长度并写入新数据。

尽快解锁文件,其他请求可能正在等待...

您可以继续使用内部结构中的数据来呈现页面,只要记住一旦您释放文件锁定并且其他 HTTP 请求可以修改它,它可能已经过时了。

李>

另外,如果您修改了用户 Web 表单中的数据,请记住它可能已在两者之间进行了修改。例如,加载包含用户详细信息的页面进行编辑,然后其他用户删除该用户,然后编辑器尝试保存更改的详细信息,并且可能会出现错误而不是重新创建已删除的用户。

注意:这是非常低效的。如果您正在构建一个您希望同时拥有 10 个以上用户的站点,您必须使用更复杂的方案,或者只使用现有数据库......此外,您不能拥有太多数据,因为解析 JSON 并生成修改过的JSON 需要时间。

只要您一次只有一个用户,它就会随着数据量的增长而变得越来越慢,但随着用户数量的增加,更多的用户意味着更多的请求更多数据,事情开始变得指数地变慢,并且您很快就会达到 HTTP 请求在文件可用于处理请求之前开始过期的限制......

此时,不要试图破解它以使其更快,而是选择一些现有的数据库框架(SQL 或 nosql 或基于文件的)。如果你开始自己破解,你最终只会重新发明***,通常很糟糕:-)。好吧,除非它只是编程练习,但即便如此,学习使用一些现有框架可能会更好。

【讨论】:

好文章。设计有效且长期运行的数据存储是困难。我记得当 Brian Aker 离开 MySQL 并开始 Drizzle 的时候;他的博客充满了所有这些有趣的设计挑战和与之相关的决定。我给他留下了一些关于 Cassandra 的信息,这似乎是一个成熟的基于 JSON 的分布式数据存储。 @hyde :我喜欢这句话:“......重新发明***”。我听说 Google Firestore 也是基于 JSON 的,它们是不是在“重新发明***”Microsoft SQL Server 这些年来在加强数据完整性、查询和性能方面做得很好? +1 用于展示可能的最佳方法并解释可能的陷阱,而不是仅仅阻止这种做法。很好的答案。 "如果您修改了数据,请将文件截断为 0 长度并写入新数据。" - 那是非常糟糕的建议,基本上这是丢失所有数据的秘诀。这就是 Mozilla Thunderbird 或 Stalker 游戏如何在旅途中破坏他们的数据。真的,你为什么要板着脸建议这个?... @Arioch'The 嗯,是的。我不记得我当时在想什么,> 8 年前。我可能应该将其更改为使用原子文件 replacememt,或进行临时备份。但是,如果丢失数据确实很重要,那么使用您自己的文件数据库无论如何都不是一个好方法。【参考方案2】:

新版 IBM Informix 12.10 xC2 现在支持 JSON。 检查链接:http://pic.dhe.ibm.com/infocenter/informix/v121/topic/com.ibm.json.doc/ids_json_007.htm

手册说它与 MongoDB 驱动程序兼容。

关于 Informix JSON 兼容性

使用面向 JSON 的查询语言的应用程序,由 MongoDB 可以与存储在 Informix® 数据库中的数据进行交互。这 Informix 数据库服务器还提供内置的 JSON 和 BSON(二进制 JSON) 数据类型。

您可以使用 MongoDB 社区驱动程序来插入、更新和查询 Informix 中的 JSON 文档。

不确定,但我相信您可以使用 Innovator-C 版本(免费用于生产)进行测试,并在生产环境中免费使用它。

【讨论】:

【参考方案3】:

我写了一个对象文档映射器来使用名为 JSON ODM 的 json 文件可能有点晚,但如果仍然需要它,它是 MIT 许可证下的开源代码。

它提供了查询语言,以及一些GeoJSON 工具

【讨论】:

【参考方案4】:

您可以选择 JSON(或其他文件格式)而不是数据库的一个明显情况是您的所有(相对较小的)数据都存储在应用程序缓存中。

当应用服务器(重新)启动时,应用从文件中读取数据并将其存储在数据结构中。

当数据更改时,应用程序会更新文件。

优点:没有数据库。

缺点:由于多种原因,只能用于数据相对较少的系统。例如,具有数百种产品的非常具体的产品网站。

【讨论】:

以上是关于我们可以使用 JSON 作为数据库吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 Crashlytics 中的 JSON 字段作为 BigQuery 中的“where”指令进行查询吗?

如何优化很长的JSON数据?

我们可以过滤存储在 JSON 中的数据吗? [关闭]

如何优化很长的 JSON 数据

使用 XML 或 JSON 文件作为数据库后端的 Django

我可以在 Objective-C 的 init 中包含 NSError** 作为参数吗?