我浏览了 Mnesia 文档和 3 本流行的 Erlang 书籍。似乎只能创建和使用单列主索引和二级索引。或者也许这正是示例所涵盖的内容?如果我在每一列上创建一个单独的索引,Mnesia 是否能够智能地一起使用它们来模拟多列键索引搜索?如果是这样,性能会比简单的表扫描好得多吗?
如果 Mnesia 不支持多列索引,那么考虑到它的原生 dbms 是否有人在 Erlang 中模拟了这个功能。
第二个问题:如何模拟约束(引用、检查)、触发器和基于事件的通知?
我浏览了 Mnesia 文档和 3 本流行的 Erlang 书籍。似乎只能创建和使用单列主索引和二级索引。或者也许这正是示例所涵盖的内容?如果我在每一列上创建一个单独的索引,Mnesia 是否能够智能地一起使用它们来模拟多列键索引搜索?如果是这样,性能会比简单的表扫描好得多吗?
如果 Mnesia 不支持多列索引,那么考虑到它的原生 dbms 是否有人在 Erlang 中模拟了这个功能。
第二个问题:如何模拟约束(引用、检查)、触发器和基于事件的通知?
一种方法是{X, Y}
直接存储在具有密钥的“列”中。这使您能够快速搜索结构查询,{_, _}
但也意味着当您只知道元组中的一个值时搜索速度较慢(默认情况下,表是哈希表)。
至于您的其他 DBMS 想要的:Mnesia 并不是为了取代传统数据库而构建的,而是为了满足爱立信开发人员在编写应用程序时的需求而构建的。因此,如果这是您的目标,那么将数据存储在传统数据库中可能会更好。
但是,您可以使用 mnesia 周围的代码添加功能 - 如果这是您想要的。
Mnesia 有基于事件的通知。它可能有一个订阅 mnesia 事件的进程(gen_server)。这些事件被分类:表事件、系统事件和其他。阅读有关事件部分的 mnesia 文档。实际上,进程可以通过调用 mnesia 事件处理程序来报告事件:mnesia:report_event(Event)
. 所有订阅 mnesia 事件的进程都会收到此消息。Mnesia 将向订阅的进程报告有关表上所有事务的实时信息。可以有读取、写入或删除事务,并且其循环中的进程可以模式匹配它可能感兴趣的事件类型。有详细和简单的表事件。我个人发现这些活动非常有用。您应该能够从文档中获取详细信息。
关于事件。现在 mnesia 表存储相同类型的记录。可以通过调用来访问此信息mnesia:table_info(Table_name::atom(),attributes)
。在 mnesia 表上应用索引时,它将接受来自这些属性的任何字段,只要它不是第一个记录字段(通常称为“主键”)。如果在表创建时应用这些索引比在运行时应用更好,因为数量的原因。考虑下面的代码片段
-记录(员工,{id,first_name,other_name,sex,age,job})。 安装(节点)-> mnesia:create_schema(节点), 失忆症:开始(), mnesia:create_table(employee,[{index,[age,sex,first_name,job]},
{attributes,record_info(fields,employee)}]), 失忆症:停止(), 好的。
如果我已经很好地理解了您的问题,我现在可以说表employee 有列:age、sex、first_name、other_name 和工作索引,并且所有用于基于索引属性进行记录搜索的mnesia API 都可以工作,例如mnesia:index_read/3 or mnesia:index_match_object/2 or mnesia:index_match_object/4
。祝你好运
/joshmuza@gmail.com