1

我在服务器端使用 datomic,客户端上有多个试剂原子,现在正在尝试在客户端上尝试数据脚本。

目前,我正在通过初始 api 加载传递嵌套结构,其中包含 datomic pull 查询的结果。它非常简洁,并且工作正常。

但是,现在希望探索 datascript 的潜在好处。卖点似乎允许将规范化保留到属性级别。但是,我遇到了最初的障碍。Datascript 不是,正如我想象的(也许,希望......),只是将您的 datomic 数据库子集化并将其复制到客户端的方法。问题是,datomic 的实体 id 不能共享给 datascript,特别是 - 当您将transact!实体放入 datascript 时,会为每个实体发布一个新的 eid(datascript's)。

我还没有解决所有的后果,但似乎有必要存储:datomic-id在 datascript 中,除了 datascript 自己新发布的:db/id,并且 ref 类型将使用 datascript 的 id,而不是 datomics。这可能会使同步回到 datomic 变得复杂,感觉它可能会产生很多潜在的陷阱,并且不像我希望的那样同构。但仍在努力。有人可以在这里分享经验吗?也许有一个解决方案...

更新: 想知道是否有一个解决方案是禁止:db/id在客户端使用 datomic,通过将它们从初始负载中过滤出来来强制执行;根本没有将它们传递给客户。然后任何客户端 - > 服务器通信都必须使用(服务器生成的)slug,它们在初始加载中传递。因此,所有实体在客户端上都会有不同的 id,但是我们禁止将服务器 id 传递给客户端,因此如果客户端 id 不小心传递给服务器,可能会说 eid 未找到。这可能还有更多问题,尚未解决。

在传递给客户端并插入客户端时,您还必须考虑实体,而不是 datoms,以便在那里创建正确的 refs(或者如果争吵,也许可以插入一棵树)。

所以我发现 datomic/datascript 伙伴关系当然不仅仅是“序列化数据库的一部分”——如果在服务器上使用 datascript 可能会起作用,这根本不是这里的用例(数据库持久性被要求)。

4

1 回答 1

1

如果我没记错的话,Datomic 使用所有 64 位作为实体 ID,但在 JavaScript(以及 DataScript 中的扩展)中,最大只有 53 位整数。因此,无论哪种方式,某种翻译层都是必要的,没有办法绕过它。

PS,您可以完全指定 :db/id 到 DataScript 中您想要的任何内容,它会使用它而不是生成自己的。只要确保适合 53 位。

于 2021-07-15T11:11:24.087 回答