Frage

Ich versuche, den besten Weg, um herauszufinden, eine Tabelle zu modellieren (aus der Datenbank Sicht) unter Berücksichtigung:

  • Die Tabelle kann eine variable Anzahl von Zeilen enthalten.
  • Die Tabelle kann eine variable Anzahl von Spalten enthalten.
  • Jede Spalte kann einen einzigen Wert enthalten, aber seine Art ist unbekannt (integer, Datum, String).
  • Es ist einfach (und performant) sein, um eine CSV-Datei, um die Daten zu erzeugen, enthält.

Ich denke an so etwas wie:

class Cell(models.Model):
    column = models.ForeignKey(Column)
    row_number = models.IntegerField()    
    value = models.CharField(max_length=100)

class Column(models.Model):
    spreadsheet = models.ForeignKey(Spreadsheet)
    name = models.CharField(max_length=100)
    type = models.CharField(max_length=100)

class Spreadsheet(models.Model):
    name = models.CharField(max_length=100)
    creation_date = models.DateField()

Kann denken Sie über eine bessere Art und Weise eine Tabelle zu modellieren? Mein Ansatz erlaubt es, die Daten als String zu speichern. Ich mache mir Sorgen um es zu langsam ist, um die CSV-Datei zu erzeugen.

War es hilfreich?

Lösung

Sie mögen EAV (Entity-Attribut-Wert) Datenmodelle studieren, da sie ein ähnliches Problem zu lösen versuchen.

Entity-Attribute-Value - Wikipedia

Andere Tipps

aus einer relationalen Sicht:

Spreadsheet <-->> Cell : RowId, ColumnId, ValueType, Contents

gibt es keine Anforderung für Zeile und Spalte Einheiten zu sein, aber Sie können, wenn Sie mögen

Die Datenbanken sind dafür nicht ausgelegt. Aber man kann ein paar verschiedene Möglichkeiten ausprobieren.

Der naiive Weg, es zu tun, ist eine Version von One Table alles zu tun, sie zu herrschen. Das heißt, schafft eine riesige generische Tabelle, alle Arten sein (n) Varchars, dass genügend Spalten hat jede vorhersehbare Tabelle zu decken. Dann werden Sie eine zweite Tabelle benötigen Metadaten über die erste zu speichern, wie zum Beispiel, was Column1 der Tabelle Spaltenname ist, welche Art speichert es (so können Sie werfen in und out) usw. Dann werden Sie Trigger müssen gegen laufen Einsätze, die die Daten kommen und die Metadaten überprüfen die Daten nicht beschädigt sind, etc etc etc. Wie Sie sehen können, ist auf diese Weise ein vollständiger und vollkommener Cluster, um sicherzustellen. Ich würde laufen von ihm schreien.

Die zweite Option ist Ihre Daten als XML zu speichern. Die meisten modernen Datenbanken haben XML-Datentypen und eine gewisse Unterstützung für XPath innerhalb Abfragen. Sie können auch XSDs verwenden irgendeine Art von Datenvalidierung zur Verfügung zu stellen, und XSLTs diese Daten in CSV-Dateien zu verwandeln. Ich bin derzeit etwas ähnliches mit Konfigurationsdateien zu tun, und seine Arbeit in Ordnung so weit. Kein Wort über Performance-Probleme noch nicht, aber ich vertraue Knuth auf, dass ein.

Die erste Option ist wahrscheinlich viel einfacher zu suchen und schneller, um Daten abzurufen aus, aber die zweite ist wahrscheinlich stabiler und auf jeden Fall einfacher zu programmieren gegen.

Es ist Zeiten wie diesen wünsche ich Celko ein SO Konto hatte.

Die beste Lösung hängt stark von der Art und Weise wird die Datenbank verwendet werden. Versuchen Sie, ein paar Top-Anwendungsfälle zu finden, die Sie erwarten und dann das Design entscheiden. Zum Beispiel, wenn es kein Anwendungsfall ist den Wert einer bestimmten Zelle aus der Datenbank zu erhalten (die Daten werden immer auf Zeilenebene geladen wird, oder auch in der Gruppe der Zeilen), dann keine Notwendigkeit, eine ‚Zelle‘ gespeichert als solche haben.

Das ist eine gute Frage, die für viele Antworten nennt, je nachdem, wie man sich ihr nähert, würde ich gerne eine Meinung mit Ihnen teilen. Dieses Thema ist eine der verschiedenen wir bei Zenkit gesucht zu, wir haben sogar einen Artikel über schrieb, würden wir Ihre Meinung über sie lieben: https://zenkit.com/en/blog/spreadsheets-vs-databases/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top