74

我对数据库服务 Datomic 很感兴趣,但我不确定它是否符合我从事的项目的需求。Datomic 什么时候是一个好的选择,什么时候应该避免它?

4

4 回答 4

51

附带条件是我没有在生产中使用 Datomic,我想我会给你一个答案。

优点

  1. 数据日志查询功能强大(比非递归 SQL 更强大)并且非常富有表现力。
  2. 可以使用 Clojure 数据结构编写查询,它不像许多允许您使用数据结构查询的 SQL 库那样是弱 DSL。
  3. 它是不可变的,因此您可以获得不可变性在 Clojure/其他语言中为您提供的优势。这还允许您在保存结构的同时在数据库中存储所有过去的事实——这对于审计等非常有用

缺点

  1. 它可能很慢,因为 Datalog 只会比等效的 SQL 慢(假设可以编写等效的 SQL 语句)。
  2. 如果你正在写很多东西,你可能需要担心单个交易者会不堪重负。在大多数情况下,这似乎不太可能,但值得考虑(不过,您可以做一种分片,并且可能会拯救自己;但这不是用于存储股票报价数据的数据库)。
  3. 启动和运行有点棘手,而且价格昂贵,而且许可和价格使得使用托管实例变得困难:您需要自己处理系统管理,而不是在 Heroku 上使用 Postgres 之类的东西或 MongoHQ 的 Mongo

我确定我在每一方面都遗漏了一些,虽然我在缺点下列出了 3 个,但我认为在缺点不排除使用它的更多情况下,优点超过了它们。价格可能会阻止它在大多数小型项目中使用(您希望超过 1 年的免费试用期)。

参照。这篇简短的文章描述 Datomic 只是为了获取更多信息。

表现力(cf Datalog)和不变性很棒。在这方面与 Dataomic 合作非常有趣,您只需稍微使用一下就可以看出它的强大。

于 2014-01-21T06:55:32.700 回答
19

为了完成上述答案,我想强调的是,不变性和记住过去的能力并不是适合审计等一些特殊情况的“神奇功能”。与“可变单元”数据库(当今 99% 的数据库)相比,这种方法具有几个深刻的好处。Stuart Halloway 在此视频中很好地展示了这一点:阻抗不匹配是我们的错

在我个人看来,这种方法从根本上来说在概念上更加理智。使用了几个月后,我没有看到 Datomic 拥有疯狂的魔法复杂功能,而是一种更自然的范式,没有其他人的一些大问题。

以下是我认为有价值的 Datomic 的一些特性,其中大部分是通过不变性实现的:

  1. 因为阅读不是远程的,所以您不必像远征一样设计您的查询。特别是,您可以将关注点分成几个查询(例如,找到作为我查询输入的实体 - 回答有关这些实体的一些业务问题 - 获取相关数据以呈现结果)
  2. 架构非常灵活,不会牺牲查询能力
  3. 将您的查询集成到您的应用程序编程语言中很舒服
  4. Entity API 为您带来 ORM 的优点
  5. 查询语言是可编程的并且具有用于抽象和重用的原语(规则、谓词、数据库函数)
  6. 表现:作家只妨碍其他作家,没有人妨碍读者。另外,大量的缓存。
  7. ......是的,一些超级大国,比如穿越到过去、投机写作或分支现实。

关于何时使用 Datomic,以下是我看到的当前约束和限制:

  1. 你必须在 JVM 上(还有一个 REST API,但你失去了 IMO 的大部分好处)
  2. 不适合写入规模,也不适合庞大的数据量
  3. 不会特别集成到框架中,例如,您当前不会找到从 Datomic 模式生成 CRUD REST 端点的库
  4. 这是一个商业数据库
  5. 由于读取发生在应用程序进程(“对等点”)中,因此您必须确保对等点有足够的内存来保存它在查询中需要遍历的所有数据。

所以我非常模糊和非正式的回答是,Datomic 非常适合大多数非平凡的应用程序,它们的写入负载是合理的,并且你对许可证和在 JVM 上没有问题

打个比方,与其他不基于不变性的版本控制系统相比,您可以对 Git 提出同样的问题。

于 2016-02-02T14:57:25.567 回答
18

在考虑 Datomic 是否适合您的应用程序时,一件重要的事情是考虑您要存储和查询的数据的形状 - 因为 Datomic 事实实际上与 RDF 三元组非常相似(+ 第一类时间概念),它适合自己非常适合对复杂关系(链接图数据)进行建模——这对于传统的 SQL 数据库来说通常很麻烦。我发现这方面对我来说是最有吸引力和最重要的方面之一,它工作得非常好,即使这当然不是 Datomic 独有的,因为还有许多其他高质量的图形数据库产品,必须提到 Neo4J当我们谈论基于 JVM 的解决方案时。
关于 Datomic 模式,我认为它只是灵活性和稳定性之间的正确平衡。

于 2014-01-21T09:46:38.553 回答
4

只是暂时添加其他答案:

可以公平地说,datomic 为所有其他当前选项的可查询数据存储提供了更好的概念框架,同时具有部分可扩展性且性能不高。

我只说部分可扩展,因为查询需要适合对等 RAM 或失败。而且性能不是特别好,因为一流的 SQL 引擎可以通过复杂的执行计划优化查询以适应内存,我还没有看到作为 datomic 的特性提到的东西;Datomic 对事务和查询的解耦可能会在整体上抵消这个特性。

然而,与许多 NoSQL 引擎不同的是,事务是一等公民,这使其在这方面与 RDBMS 系统相提并论。

对于数据读取多于写入、需要事务、查询总是适合内存或内存非常便宜、累积数据的总体大小不太大的应用程序,如果只使用商业产品,这可能是一个胜利可以负担得起——对于那些愿意接受其 API 中隐含的新颖概念框架的人。

于 2017-07-21T21:52:32.750 回答