2016-05-15 3 views
1

Ich habe eine Anwendung, die eine Datenbank mit einer Reihe von Produkten erfordert, wo jedes Produkt eine Reihe von Tabellen haben kann. Der Endbenutzer sollte in der Lage sein, neue Produkte hinzuzufügen und neue Tabellen für ein Produkt zu definieren. Jede Tabelle hat also eine Reihe von Spalten, die vom Benutzer angegeben werden. Der Benutzer kann dann die Tabellen mit Datenzeilen füllen. Jede Tabelle gehört zu genau einem Produkt.Datomic Tabelle Modell

Der Endbenutzer sollte die Tabellen auch so anzeigen können, wie sie zu einem bestimmten Zeitpunkt (bei einer bestimmten Transaktion) waren.

Wie würde ich ein Schema dafür in Datomic machen, so dass die Abfrage so effizient wie möglich wäre?

+0

Ich persönlich müsste Beispiele sehen, bevor ich diese Frage beantworten kann, zumal "Tabelle" ein so überladener Begriff in der Datenbankwelt ist. –

+0

Eine Tabelle in dieser Frage entspricht einer Tabelle in einer SQL-Datenbank. Es ist durch eine Reihe von Spalten definiert und enthält Datenzeilen. [Hier] (http://www.teach-ict.com/gcse_new/databases/terminology/miniweb/images/table.gif) ist ein Beispiel für eine solche Tabelle. –

Antwort

1

Ich würde mit 4 Entitätstypen gehen: Produkte, Tabellen, Spalten und Zeilen. Die Beziehung zwischen Produkten und Tabellen wird am besten durch ein :table/product To-One-ref-Attribut behandelt, aber ein :product/tables to-many-Komponente-ref-Attribut könnte ebenfalls funktionieren (das letztere erzwingt die 1: n-Beziehung nicht).

Ebenso würde ich entweder ein :column/table oder :table/columns Attribut verwenden. Ich hätte auch ein :column/name String-Attribut und vielleicht ein :column/type Enumerated-Attribut.

Der schwierigste Teil ist das Modellieren von Reihen.

Eine verlockende Lösung ist, nur ein Attribut pro Spalte zu erstellen - ich denke eigentlich, es ist eine schlechte Idee, Datomic Attribute sind nicht für eine solche dynamische Verwendung gedacht. Insbesondere werden Schemaattribute in einem Cache auf dem Peer gespeichert, der nicht groß werden soll. (Ich kann über diese falsch sein, so wäre es schön, wenn jemand in der Datomic Team bestätigen könnten.)

Stattdessen würde ich ein paar Dutzend haben wiederverwendbare :row/cell-0, :row/cell-1, :row/cell-2 usw. ‚Zellposition‘ Attribute , die über alle Tabellen verteilt sind. Jede tatsächliche Spalte würde zum Zeitpunkt der Erstellung durch ein :column/position Attribut zugeordnet werden.

Wenn die Zeilen mehrere Datentypen haben können, ist es etwas schwieriger, Sie müssten grundsätzlich ein Attribut für jedes (Typ, Position) Paar erstellen.

Dann besteht jede Zeile im Wesentlichen aus einem :row/table Attribut und den oben genannten Zellenpositionsattributen.

Hier ist eine Datalog Abfrage, die Sie die ganzen Tabelle

[:find ?row ?column-name ?val :in $ ?table :where 
[?column :column/table ?table] 
[?row :row/table ?table] 
[?row ?pos ?val] 
[?column :column/position ?pos] 
[?column :column/name ?column-name]] 

Hinweis lesen lassen würden, dass alle der oben genannten sind nur sinnvoll, wenn Sie die Tabelle mit Datalog direkt gegen Ihre Datomic db abfragen mögen. Es kann aber auch völlig in Ordnung sein, Ihre Tabellen zu serialisieren und sie als Blobs zu speichern - vor allem, wenn sie klein sind; später ziehst du den Blob heraus, deserialisierst ihn, dann kannst du ihn auch mit Datalog abfragen. Und wenn Tabellen zu grob für diese Verwendung sind, können Sie es vielleicht mit Zeilen machen.

+0

Das Modellieren der Zeilen war genau das, worauf ich festhielt, danke für die Ideen! –

Verwandte Themen