我想学习一门函数式语言,而 Mnesia 似乎是“ killer 级应用”,足以让我学习 Erlang。我想先澄清一些概念。
Mnesia 如何对关系实现参照完整性?旧文章说它不是在数据级别强制执行的。现在改了吗?或者 Erlang 和 Mnesia 是否提供了允许我们编写可证明正确且可维护的代码以维护引用完整性的功能?即使是跨 n 个表的传递关系?
查询语言是否支持临时查询,缺少全文?
大容量分布式系统呢?有 4GB 的文件限制,对吗?如何将 10(或更多)百万行写入数据库?它会自动将自己分发到其他节点,从而变得高可用性吗?这与碎片有关。我想知道这是否是我每天都要担心的操作概念。
它是否可以轻松配置以便跨物理位置进行复制,就像 MySQL 主从设置一样?
最佳答案
是几个问题:
- 引用完整性 - 不,mnesia 不保持跨表的引用完整性。 Mnesia 只是 k/v 存储,但甚至可以跨表为您提供原子事务。因此,您必须自己保持引用完整性,但 mnesia 可以帮助您将事务编写为函数并启用嵌套事务。 Mnesia 将表和索引之间的参照完整性保持在最大值 ;-)
- 临时查询 - 不,它不适用于 mnesia 但
qlc
模块可以帮助您完成这项任务。 - 全文 - 不,不支持开箱即用。 Mnesia 使用应用程序语言 (Erlang) 编写事务的能力可以帮助您,但您必须制定自己的解决方案。
- 高容量 - 有碎片表来处理更大的数据量。
- 高可用性 - 表副本对此提供支持。 (还支持表片段的副本。)
- 主从 - mnesia 支持开箱即用的主从复制。如果您需要主从复制,则必须在事务日志的支持下推出自己的解决方案。 (参见
mnesia:subscribe/1
和 Mnesia Event Handling。)
关于erlang - 'conventional wisdom' 概念是如何在 Mnesia 中实现的?参照完整性、复制、高容量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9156293/