如何在Erlang Mnesia中创建和使用(或模拟)多列索引

如何在Erlang Mnesia中创建和使用(或模拟)多列索引,erlang,otp,mnesia,secondary-indexes,Erlang,Otp,Mnesia,Secondary Indexes,我浏览了Mnesia文档和3本流行的Erlang书籍。似乎只能创建和使用单列主索引和辅助索引。或者,这只是例子所涵盖的?如果我在每一列上创建一个单独的索引,Mnesia是否能够智能地使用它们来模拟多列键索引搜索?如果是这样,性能会比简单的表扫描好得多吗 如果Mnesia不支持多列索引,那么考虑到它的特性,本机dbms有人在Erlang中模拟了这一功能 第二个问题:如何模拟约束(引用、检查)、触发器和基于事件的通知?一种方法是将{X,Y}直接存储在具有键的“列”中。这使您能够快速搜索结构为{{,{

我浏览了Mnesia文档和3本流行的Erlang书籍。似乎只能创建和使用单列主索引和辅助索引。或者,这只是例子所涵盖的?如果我在每一列上创建一个单独的索引,Mnesia是否能够智能地使用它们来模拟多列键索引搜索?如果是这样,性能会比简单的表扫描好得多吗

如果Mnesia不支持多列索引,那么考虑到它的特性,本机dbms有人在Erlang中模拟了这一功能


第二个问题:如何模拟约束(引用、检查)、触发器和基于事件的通知?

一种方法是将
{X,Y}
直接存储在具有键的“列”中。这使您能够快速搜索结构为
{{,{}
的查询,但这也意味着当您只知道元组中的一个值时搜索速度较慢(默认情况下,表是哈希表)

至于您的其他DBMS需求:Mnesia并不是为了取代传统数据库而构建的,而是为了满足爱立信开发人员在编写应用程序时的需求而构建的。因此,如果您的目标是将数据存储在传统数据库中,那么您的情况可能会更好


但是,如果您需要的话,您可以通过围绕mnesia的代码添加功能。

mnesia有基于事件的通知。可以有一个进程(gen_服务器)订阅mnesia事件。这些事件被分类为:表事件、系统事件和其他事件。阅读有关事件部分的mnesia文档。实际上,流程可以通过调用:
mnesia:report\u event(event)
使用mnesia事件处理程序报告事件。所有订阅mnesia事件的进程都将收到此消息。 Mnesia将向订阅的流程报告表上所有事务的实时信息。可以有读、写或删除事务,循环中的流程模式可以匹配它可能感兴趣的事件类型。有详细和简单的表事件。我个人认为这些活动非常有用。您应该能够从文档中获得详细信息

关于事件。现在,mnesia表存储相同类型的记录。可以通过调用
mnesia:table\u info(table\u name::atom(),attributes)
访问此信息。在mnesia表上应用索引时,它将接受这些属性中的任何字段,只要它不是第一个记录字段(通常称为“主键”)。由于许多原因,在创建表时应用这些索引比在运行时应用更好。考虑下面

的代码片段 -record(employee,{id,first_name,other_name,sex,age,job}). install(Nodes)-> mnesia:create_schema(Nodes), mnesia:start(), mnesia:create_table(employee,[{index,[age,sex,first_name,job]},
{attributes,record_info(fields,employee)}]), mnesia:stop(), ok. -记录(员工,{id,名字,其他名字,性别,年龄,工作})。 安装(节点)-> mnesia:创建_模式(节点), 记忆:开始(), mnesia:create_表(employee,[{index,[age,sex,first_name,job]},
{attributes,record_info(fields,employee)}), 记忆:停止(), 好啊 如果我已经很好地理解了你的问题,我现在可以说表中的employee有列:年龄、性别、名字、其他名字和职务索引,所有用于基于索引属性进行记录搜索的mnesia API都会工作,例如

mnesia:index\u read/3或mnesia:index\u match\u object/2或mnesia:index\u match\u object/4
。祝你好运


/joshmuza@gmail.com

非常感谢。只是为了更好地理解:对于表(staff,{id,{sal,lname,fname},sex,phone}),我会记忆:添加表索引(staff,{sal,lname,fname}),按薪水排序,然后使用元组字段{sal,lname,fname}命名?Mnesia是否接受元组表字段和元组索引字段?或者更确切地说,通过编程手动将我的键字段数据合并到一个键字段中,我现在将其用作键字段?这听起来可能有点幼稚,但我对所有这一切都很陌生。我愿意尝试一些方法,并尝试这些替代方法,但任何帮助都是一种挑战谢谢。干杯。乔·皮耶斯请忽略我的最后一个问题,因为答案显而易见。谢谢。