我想为我的应用程序持久存储数据,但我并不真正需要一个完整的关系数据库。我真的可以使用基本的“缓存”式持久存储,其中结构只是一个(键,值)对。
代替数据库,我最好的、可扩展的选项是什么?
我想为我的应用程序持久存储数据,但我并不真正需要一个完整的关系数据库。我真的可以使用基本的“缓存”式持久存储,其中结构只是一个(键,值)对。
代替数据库,我最好的、可扩展的选项是什么?
总是有SQLite,一个存储在文件中的数据库。SQLite 已经内置了并发性,因此您不必担心文件锁定之类的事情,而且读取速度非常快。
但是,如果您要进行大量数据库更改,最好在一个事务中一次完成所有更改。这只会将更改写入文件一次,而不是每次发出更改查询。这极大地提高了进行多项更改的速度。
发出更改查询时,无论是否在事务中,整个数据库都会被锁定,直到该查询完成。这意味着非常大的事务可能会对其他进程的性能产生不利影响,因为它们必须等待事务完成才能访问数据库。在实践中,我并没有发现这很明显,但尝试尽量减少您发出的数据库修改查询的数量始终是一个好习惯。
如果您想要一个“持久缓存”,并且已经使用memcached,请检查memcachedb。它是一个使用 memcached 协议的持久哈希表,不需要新的客户端(但需要一个新的守护进程)
我最近问了一个类似的问题。以下是一些选择:
如果您需要可扩展性,那么 RDBMS 是您的最佳选择。在最基本的层面上,您可以将数据结构序列化为文件 - 但是,您需要考虑会限制并发性的文件锁定问题。
SQLite 是一个基于 SQL 文件的数据库引擎,它可以在没有持久数据库守护程序的情况下运行(例如,在 PHP 中,它作为扩展运行),但是它也存在并发问题(阅读这个问题的答案,这可以帮助您决定是否SQLite 适合你)。
除非您有充分的理由不使用真正的 DRBMS,否则我建议您坚持使用 MySQL 或其他“成熟的”引擎。
如果您想要一些真正可扩展的东西,我不会选择平面文件或 XML 文件。随着数据的增长,它可能会影响您的性能。
如果您在某个阶段会有大量数据,我仍然会选择数据库 - 我会看一下SQLIte 之类的东西,它有一个非常简单的模式来满足您的需求。
我真的不确定您是否应该这样做,但您是否考虑过将信息存储在 XML 文档中,如果它真的那么轻吗?如果你没有考虑SQLite?
如果您编写一个需要嵌入式数据库的 java 程序,请查看hsqldb,因为它是用 java 编写的,并且如果从 java 程序中调用它,那么它比 sqlite 好得多。
如果您正在编写 Java,那么您可以直接包含 Java 数据库实现(Jared 提到了 hsqldb,还有其他)。
SQLite 适合静态包含,但如果您使用 C 等兼容语言,您也可以在应用程序中包含 MySQL。
我想你也会很高兴有 SQL 可用。XML 文件不再适用了,也许是几年前在编写 PDA 软件时,但现在即使是 iPhone 和 Android 也包含 SQLite。
内存模式下的 hsqldb 将为您提供比基于平面文件的数据库更好的性能。它也很容易使用。如果表变得太大,也可以选择将其缓存在磁盘上。查看此性能比较:
(来源:hsqldb.org)
对于 Key=Value 对,您可以使用带有简单加载和保存过程的 INI 文件格式来加载它并将其保存到内存中的哈希表中。
以后可以扩展到任何东西,只需更改加载和保存过程以使用 db。
您可以尝试CounchDB,它是一个非常灵活的面向文档的数据库,不会强制您预先定义模式。它是用 Erlang 编写的,因此它被认为是非常可扩展的解决方案。可以通过 REST 接口轻松查询。