Data Modeling
Use :db/ident
For Enumerations
Many databases need to represent a set of enumerated values. In Datomic,
it is idiomatic to represent enumerated values as entities with a
:db/ident
attribute.
For example, the transaction below defines an :artist/country
attribute, and two initial enumerated values, :country/CA
and
:country/JP
, ISO alpha-2 country codes for Canada and Japan:
[{:db/ident :artist/country :db/valueType :db.type/ref :db/cardinality :db.cardinality/one :db/doc "An artist's country of residence"} {:db/ident :country/CA} {:db/ident :country/JP}]
The use of :db/ident
on the enumerated value entities makes it possible to refer to the entities using their identity keywords,
:country/CA
and :country/JP
.
The transaction below creates an artist named Leonard Cohen with the
country :country/CA
:
[{:artist/name "Leonard Cohen" :artist/country :country/CA}]
The :artist/country
attribute is of type :db.type/ref
, so its value
must be a reference to another entity. The :country/CA
keyword can be
used as a value because it is the identity of an entity, as specified by
:db/ident
in the previous transaction.
Attempting to use identity keywords that have not been transacted as referenced identities will result in an anomaly.