10

ets:select vs mnesia:select 哪个更好用。而且在插入和删除的情况下,我们应该使用这两者中的哪一个。我正在研究 ejabberd。任何指针?

4

1 回答 1

18

tl;博士

它们是为不同目的而构建的工具:ETS 是一个快速的 K/V 存储,Mnesia 是一个构建在它们之上的数据库。使用适合您用例的工具。

讨论

Mnesia 建立在 ETS/DETS 之上。哪个更有效取决于您正在寻找什么功能。如果你有没有额外逻辑的简单表,一个简单的索引键,并且只在内存或磁盘中使用表,那么 ETS 和 Mnesia 之间没有区别,你不会使用任何 Mnesia 功能。

另一方面,如果您需要多个数据索引,想要实现一些缓存行为,需要磁盘持久性但缓存索引性能,以及您期望从数据库系统获得的其他东西,那么您要么拥有在 ETS/DETS 之上自己实现 Mnesia 类型的功能,或者简单地使用 Mnesia。

很多时候,我在原型设计时(或者甚至在生产中的早期版本功能)开始使用一些 ETS 表,然后开始寻找我需要序列化数据和在磁盘上的位置,然后意识到我需要多个索引等,最后移动了很多无论如何,最初在 ETS 中进入 Mnesia 的数据管理内容。如果您正确地抽象出数据访问的概念,那么以任何一种方式更改系统这部分的实现都不是问题。但是,如果您的模块中分散有选择调用,那么您可能还有其他架构问题需要解决,这些问题比 ETS 与 Mnesia 更重要。


无论您使用什么,请确保您没有以整个系统的所有状态的中央存储库的形式创建系统范围的瓶颈。这是一个错误,我看到很多人来自 (C/Python/$imperative_lang + Postgres/MariaDB/$rbdms) 类型的背景。

阅读ErlMUD Commentary: Architecture, Locations的第 2-6 段,在高层次上对状态表示进行架构讨论。

于 2015-02-13T08:10:38.537 回答