2009-06-30 89 views
4

我正在开发一个需要很多数据库写入的Erlang应用程序。除了主键之外,我的模式还有一个强制执行唯一约束的属性。Mnesia中的唯一约束条件

说我有一个ID,一个unique_constraint_field和其他一些字段。由于没有其他行应具有我要更新的unique_constraint_field值的值,因此我需要现在更新DB中对应于唯一ID的行。由于更新量大(每次更新只会影响1行),我需要执行(也需要低延迟),我依靠主键和该属性的唯一约束来捕获重复,而不是使用子查询的更新语句。这允许我在单个查询中执行更新(这发生在95%的时间内),而在剩余的5%中,我可以捕获异常以采取有关主键或唯一属性违规的必要操作。

我目前使用ODBC mysql驱动程序。但是,驱动程序返回任何错误的非常通用的错误消息。尽管现在我的原型在我认为任何错误都是关键违规时都运行良好,但这种模式显然存在很多缺陷。我找不到任何其他像样的驱动程序/从erlang连接到mysql的方式。

由于Erlang和Mnesia无缝融合,我正在考虑切换到Mnesia(仅限内存模式以满足我的速度要求)。但是,我发现Mnesia没有任何可用于在单个查询中执行数据库更新的唯一键约束。

我需要关于如何最好地从Erlang内部实现这个需求的建议。有什么方法可以在Mnesia中执行条件更新?或者,我还有其他高速数据库选择吗?任何帮助/见解非常感谢。

回答

1

我不知道什么是最好的解决方案,但我会尝试做两个表格一个记录和一个索引与unique_constraint_field和处理每个CUD CRUD操作在交易检查和更新索引。原因是在mnesia你不能设置索引类型,并且总是重复包。我认为这是因为你的指数无论如何都是唯一的,它不应该引入额外的表现惩罚。如果您使用mnesia索引功能,您仍然必须编写自己的CUD操作,并且结果与使用两个表格几乎相同。幸运的是,mnesia以最少的开发工作量处理嵌套事务,与传统的RDBMS相比,这件事相对容易。

1

Ulf Wiger发布了一个库,允许您使用mnesia作为关系数据库。它被称为'rdbms',它已经有几年了,并且很久没有更新过了,但你可以直接使用它,或者至少将自己的工作放在他的工作上来处理它。 Grab the source如果你想。

他的描述:

我重温我的标准应答 的“RDBMS”的contrib提供了一个解决方案 此,通过提供支持 化合物的属性和用户定义 索引,包括选项 指定索引值必须为 唯一。

Rdbms /已被商业使用, ,但我不认为它准备好 商业用途。我没有 做了很长一段时间的任何事情, ,因为我不觉得任何用户 压力,但任何人想要这样的变化,当然是欢迎联系我 我争辩他们的情况。

http://ulf.wiger.net/rdbms/doc/rdbms.html (该文档留下很多有待改进,我 知道 - 见上文)。

的文档mentionning的 '独一无二' 的约束,可以发现here。有可能会有性能点击; mnesia是为了成为一个关键价值的存储。我不能完全记住,但是可能在检查它们时定义“唯一”索引可能涉及全表遍历。

总而言之,因为它很旧,所以在运行时可能会遇到麻烦。请参阅trapexit thread about it。用它来研究它是如何完成的可能是一个更好的主意。

2

mnesia可以crash与大量的写入,除非你tune it。但是您可以使用看起来像{ID, UniqueConstraint}的复杂主键,这可以使您的更新变得更简单。还有一个名为osmos的新erlang库,用于在专门为处理大量写入而创建的磁盘ordered_set表中。

+0

谢谢,这听起来很有趣,会看看。 – jeffreyveon 2009-07-28 16:36:48