Schema Modeling

Use :db/ident for Enumerations

Many databases need to represent a set of enumerated values. In Datomic, it's idiomatic to represent enumerated values as entities with a :db/ident attribute.

For example, this transaction 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, respectively.

This transaction 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.