Empfohlene Methode zum Deklarieren eines Datomic-Schemas in der Clojure-Anwendung

8

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:

  1. Eine übersichtliche, lesbare Darstellung für das Schema
  2. Stellen Sie sicher, dass das Schema installiert und auf dem neuesten Stand ist, bevor Sie eine neue Version meiner App ausführen.

Intuitiv wäre mein Ansatz folgender:

  1. Deklarieren einiger Hilfsfunktionen, um Schemadeklarationen weniger ausführlich als mit den Raw-Maps zu machen
  2. Automatisches Installieren des Schemas als Teil der Initialisierung der App (ich weiß noch nicht, ob das immer funktioniert).

Ist das der beste Weg zu gehen? Wie machen es die Leute normalerweise?

    
Valentin Waeselynck 14.07.2015, 20:12
quelle

6 Antworten

4

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 .

    
Mitchel Kuijpers 14.07.2015 20:42
quelle
3
  1. Raw-Maps sind ausführlich, haben aber einige große Vorteile gegenüber einigen high-level api:

    • Schema ist in Transaktionsform definiert, was Sie angeben, ist transactable (vorausgesetzt, das Wort existiert)
    • Ihr Schema ist nicht an eine bestimmte Bibliothek oder Spezifikationsversion gebunden, es funktioniert immer.
    • Ihr Schema ist serialisierbar (edn), ohne eine spec API aufzurufen.
    • So können Sie Ihr Schema in einer verteilten Umgebung einfacher speichern und bereitstellen, da es in Datenform und nicht in Codeform vorliegt.

Aus diesen Gründen verwende ich rohe Karten.

  1. Schema automatisch installieren.

Das tue ich auch nicht.

Wenn Sie eine Änderung an Ihrem Schema vornehmen, können viele Dinge passieren:

  • Neues Attribut hinzufügen
  • Ändern Sie den vorhandenen Attributtyp
  • Erstellen Sie Volltext für ein Attribut
  • Erstellen Sie ein neues Attribut aus anderen Werten
  • Andere

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:

%Vor%     
Guillermo Winkler 15.07.2015 02:50
quelle
2

Für # 1 könnte datomic-schema hilfreich sein. Ich habe es nicht benutzt, aber das Beispiel sieht vielversprechend aus.

    
nberger 14.07.2015 21:22
quelle
1

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).

    
CmdrDats 15.07.2015 06:47
quelle
1

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%     
Valentin Waeselynck 17.07.2015 16:55
quelle
1

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

    
Alan Thompson 14.07.2015 22:13
quelle

Tags und Links