новичок в datomic / datascript - можем ли мы иметь несколько схем

очень простой вопрос, чтобы я начал. Допустим, у меня есть база продаж по странам:

[{:sales/country "CN" :sales/amount 1000 :sales/account "XYZ"} ...]

Я также хотел бы иметь список фактов о каждой стране, например:

[{:country/short-name "CN" :country/long-name "China" ...}]

Затем выполните запросы типа «перечислить все продажи, которые произошли в Китае (используя полное имя)».

Это одна база данных? Как мне дать понять, что есть две разные схемы? Должен ли я выполнять транзакцию сначала по схеме, затем с данными о продажах, а затем со схемой страны и данными?

Спасибо,

1 ответ

У вас может быть только 1 схема, но этого должно быть достаточно. Используйте пространство имен в ключевых словах, чтобы различать разные «домены» ( :country/*для информации о странах, :sales/*информацию о распродажах).

Datomic — это скорее хранилище столбцов, поэтому любой объект может иметь любой атрибут, и вы даже можете смешивать разные «таблицы» для одного атрибута (я не рекомендую это, но это возможно).

Вы используете то, что Datomic называет «внешним идентификатором». Это также хорошая практика, хотя нет возможности указать, что это ссылка на :country/code.

Вместо этого я предлагаю вам сделать :sales/countryDatomic ссылка:

      :sales/country-code {:db/valueType :db.type/ref}

а затем связать его в транзакции, используя ссылку поиска:

      @(d/transact! conn [{:sales/country [:country/code "CN"] :sales/amount 1000 :sales/account "XYZ"})

Это обеспечит существование страны с этим кодом во время транзакции. Вы также получите такие преимущества, как простое извлечение информации о стране из продаж с помощью entity/pull.

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