Ich fange an, eine von Datomic unterstützte Clojure-App zu entwickeln, und ich frage mich, wie ich das Schema am besten deklariere, um die folgenden Bedenken auszuräumen:
Intuitiv wäre mein Ansatz folgender:
Ist das der beste Weg zu gehen? Wie machen es die Leute normalerweise?
Ich verwende die Konformität dafür, siehe Konformitäts-Repository . Es gibt auch einen sehr nützlichen Blogpost von Yeller Hier , der Sie zur Verwendung von Conformity führt .
Raw-Maps sind ausführlich, haben aber einige große Vorteile gegenüber einigen high-level api:
spec
API aufzurufen. Aus diesen Gründen verwende ich rohe Karten.
Das tue ich auch nicht.
Wenn Sie eine Änderung an Ihrem Schema vornehmen, können viele Dinge passieren:
Möglicherweise müssen Sie Ihre vorhandenen Daten auf eine nicht offensichtliche und nicht generische Weise in einem Prozess ändern, der einige Zeit dauern kann.
Ich verwende eine Automatisierung , um eine Liste von Schemas anzuwenden und Schemaänderungen, aber immer in einer kontrollierten "Bereitstellungs" -Stufe, wenn mehr Dinge bezüglich der Datenaktualisierung auftreten können.
Angenommen, Sie haben users.schema.edn
und roles.schema.edn
Dateien:
Für # 1 könnte datomic-schema hilfreich sein. Ich habe es nicht benutzt, aber das Beispiel sieht vielversprechend aus.
Meine Präferenz (und ich bin voreingenommen, wie der Autor der Bibliothek) liegt bei datomic- Schema - Es konzentriert sich darauf, nur die Transformation zum normalen Datenschema durchzuführen - von dort aus übertrage man das Schema wie gewohnt.
Ich möchte die gleichen Daten verwenden, um die Schemamigration zwischen der Live-Datomic-Instanz und den Definitionen zu berechnen - damit die Enums, Typen und Kardinalitäten entsprechend Ihrer Definition geändert werden.
Der wichtige Teil (für mich) von datomic-schema ist der Exit-Pfad ist sehr sauber - Wenn Sie feststellen, dass es nicht unterstützt etwas (das ich aus irgendeinem Grund nicht implementieren kann) auf der ganzen Linie, können Sie Ihr Schema als einfache edn, speichern Sie es ab und entfernen Sie die Abhängigkeit.
Conformity wird darüber hinaus nützlich sein, wenn Sie eine Art Datenmigration durchführen möchten, oder spezifischer Migrationen (bereinigen der Daten oder zuerst umbenennen zu etwas anderem).
Vorschlag: Verwenden von Transaktionsfunktionen, um das Deklarieren von Schemaattributen in EDN < zu vereinfachen , wodurch die Vorteile der Deklaration Ihres Schemas in EDN erhalten bleiben, wie in @Guillermo Winklers Antwort .
Beispiel:
%Vor%Ich würde vorschlagen, Tupelo Datomic zu verwenden, um loszulegen. Ich habe diese Bibliothek geschrieben, um die Erstellung von Datomic-Schemata zu vereinfachen und das Verständnis zu erleichtern, so wie Sie es in Ihrer Frage angedeutet haben.
Nehmen wir als Beispiel an, dass wir versuchen, die Informationen für die weltweit erste Spionageagentur aufzuspüren. Lassen Sie uns ein paar Attribute erstellen, die auf unsere Helden & Amp; Schurken (siehe ausführbaren Code im Unit-Test ).
%Vor%Für das Attribut: weapon / type wollen wir einen enumerierten Typ verwenden, da unseren Gegnern nur eine begrenzte Anzahl von Auswahlmöglichkeiten zur Verfügung steht:
%Vor%Lassen Sie uns ein paar Antagonisten erstellen und in die DB laden. Beachten Sie, dass hier nur einfache Clojure-Werte und Literale verwendet werden und dass wir uns nicht um Datomic-spezifische Konvertierungen kümmern müssen.
%Vor%Viel Spaß! Alan