4

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

假设我有一个 ID、一个 unique_constraint_field 和一些其他字段。我现在需要更新数据库中与唯一 ID 对应的行,因为没有其他行应该已经具有我要更新的 unique_constraint_field 值的值。

由于大量更新(每次更新只会影响 1 行)我需要执行(也需要低延迟)我依靠主键和对该属性的唯一约束来捕获重复,而不是更新语句使用子查询。这允许我在单个查询中执行更新(这发生在 95% 的时间),在剩余的 5% 中,我可以捕获异常以对主键或唯一属性违规采取必要的措施。

我目前正在使用 ODBC mysql 驱动程序。但是,驱动程序会为任何错误返回一个非常通用的错误消息。虽然现在当我假设任何错误都是关键违规时我的原型运行良好,但这个模型显然存在很大缺陷。我找不到任何其他体面的驱动程序/方式来从 erlang 连接到 mysql。

我正在考虑切换到 Mnesia(满足我的速度要求的纯内存模式),因为 Erlang 和 Mnesia 融合得如此无缝。但是,我看到 Mnesia 没有任何唯一的键约束,我可以使用这些约束在单个查询中执行我的数据库更新。

我需要有关如何从 Erlang 中最好地实现此要求的建议。有没有办法在 Mnesia 中执行条件更新?或者,我应该考虑其他任何高速数据库替代方案吗?非常感谢任何帮助/见解。

4

3 回答 3

2

mnesia除非您调整它,否则可能会因大量写入而崩溃。但是您可以使用看起来像 的复杂主键,这可以使您的更新更加简单。还有一个名为osmos的新 erlang 库,用于专门为处理大量写入而创建的磁盘表。{ID, UniqueConstraint}ordered_set

于 2009-07-26T15:34:07.823 回答
1

Ulf Wiger 发布了一个库,可让您将 mnesia 用作关系数据库。它叫做'rdbms',它有几年历史了,很长时间没有更新,但你可能可以照原样使用它,或者至少根据他的工作来处理它。如果需要,请获取源。

他对此的描述:

我通过提供对复合属性和用户定义索引的支持(​​包括指定索引值必须是唯一的选项)来消除我的标准响应,即“rdbms”贡献为此提供了解决方案。

Rdbms /has/ 已用于商业用途,但我不认为它已准备好用于一般商业用途。我已经有一段时间没有做任何事情了,因为我没有感觉到任何用户压力,但是当然欢迎任何想要改变这种情况的人与我联系并为他们的案子辩护。

http://ulf.wiger.net/rdbms/doc/rdbms.html (文档有很多不足之处,我知道 - 见上文。)

可以在此处找到提及“唯一”约束的文档。有可能会影响性能;mnesia 是一个键值存储。我记不清了,但定义“唯一”索引可能会在检查它们时涉及全表遍历。

总而言之,由于它很旧,您可能无法运行它。请参阅有关它的 trapexit 线程。用它来研究它是如何完成的可能是一个更好的主意。

于 2009-07-17T18:41:01.727 回答
1

I don't know what is best solution but what I'd try is make two tables one for records and one for index with unique_constraint_field and handle each CUD from CRUD operations in transaction which check and update index. Reason is that in mnesia you can't set index type and always is duplicate bag. I think that because your index will be unique anyway, it should not introduce any additional performance penalty. If you use mnesia index feature you would still have to write your own CUD operations and result seems almost same as using two tables. Fortunately mnesia handles nested transaction with minimal developer effort and this thing is relatively easy compared to classical RDBMSs.

于 2009-07-02T09:09:00.387 回答