Datomic id в датаскрипте

Я использую datomic на стороне сервера, с несколькими атомами реагентов на клиенте, и теперь пытаюсь попробовать datascript на клиенте.

В настоящее время я передаю вложенную структуру через начальную загрузку API, которая содержит результат запроса datomic pull. Это довольно лаконично и отлично работает.

Однако сейчас мы пытаемся изучить потенциальные преимущества датаскрипта. Пункт продажи, кажется, позволяет сохранить нормализацию вплоть до уровня атрибута. Тем не менее, я сталкиваюсь с первоначальным препятствием. Datascript не является, как я себе представлял (возможно, надеялся...), способом просто подмножить вашу datomic db и реплицировать ее на клиенте. Проблема в том, что идентификаторы сущностей datomic не могут быть переданы в datascript, в частности, когда вы transact!объектов в сценарий данных, для каждого объекта выдается новый eid (скрипт данных).

Я еще не проработал все последствия, но, похоже, необходимо хранить :datomic-idв datascript, в дополнение к собственным вновь выпущенным datascript, и типы ref будут использовать идентификатор datascript, а не datomics. Это потенциально усложняет синхронизацию обратно в datomic, кажется, что это может создать много потенциальных ошибок, и не так изоморфно, как я надеялся. Но все еще работаю над этим. Может тут кто опытом поделится? Может есть решение...

Обновление: интересно, решение состоит в том, чтобы запретить использование datomic :db/idна клиенте, применяя это, отфильтровывая их от начальной загрузки; вообще не передавая их клиенту. Тогда любое взаимодействие между клиентом и сервером должно будет вместо этого использовать (сгенерированные сервером) слаги, которые передаются при начальной загрузке. Таким образом, все объекты будут иметь разные идентификаторы на клиенте, но мы запрещаем передачу идентификатора сервера клиенту, поэтому идентификатор клиента, если он случайно передан серверу, вероятно, должен сказать, что eid не найден. Вероятно, есть еще проблемы с этим, еще не разобрался с этим.

Вы также должны думать в сущностях, а не в данных, при передаче и вставке в клиент, чтобы создать там правильные ссылки (или, возможно, можно было бы вставить дерево, если это спорно).

Итак, я обнаружил, что партнерство datomic/datascript, безусловно, не является просто случаем «сериализации части вашей базы данных» — это может работать при использовании datascript на сервере, что здесь вообще не используется (постоянство db требуется).

1 ответ

Если я правильно помню, Datomic использует все 64 бита для идентификаторов сущностей, но в JavaScript (и, соответственно, в DataScript) максимум 53-битные целые числа. Так что какой-то уровень перевода необходим в любом случае, никак не обойти его.

PS вы можете полностью указать :db/id для всего, что хотите в DataScript, и он будет использовать это вместо того, чтобы генерировать свой собственный. Просто убедитесь, что он соответствует 53 битам.

Другие вопросы по тегам