2017-10-30 5 views
2

Ich habe eine Verständnisfrage, weil ich darüber nachdenke, wie ich meine Daten in Django oder der Datenbank verwalten soll.Wie erstellt man neue Tabellen in der Datenbank für jeden Tag in Django

Es ist eine Tabelle mit etwa 2000 Zeilen pro Tag und 8 Spalten. Ich möchte alle täglichen Daten der letzten 10 Jahre in die Datenbank speichern und jeden Tag neue Daten hinzufügen. Es empfiehlt sich, für jeden Tag eine Datenbanktabelle zu erstellen. In Django wird für jedes Modell eine Tabelle erstellt, aber es ist nicht beabsichtigt, dass der Erfinder 5000 Modelle in Django erstellt.

Ist es die einzige Methode, mit der ich Raw SQL zum Erstellen der Tabellen verwende? Oder gibt es einen Weg, den ich in der Dokumentation nicht entdeckt habe?

Antwort

5

Die kurze Antwort auf die Frage gestellt Sie „Ja, die schnellste Methode wäre, Raw SQL zu verwenden, "oder eine Variante, die dynamisch neue Modelle erstellt und Makemigrationen ausführt.

Das heißt, in Ermangelung weiterer Informationen über Ihr Problem oder Ihre Aufgabe, muss ich sofort fragen, warum Sie Tabellen dynamisch erstellen möchten. Für den Anfang, das wird Sie die schönen Django-bereitgestellten ORM-Verbindungen zum Schema ohne mehr Trickserei verlieren (automatisch generierte Modelle, tägliche Makemigrationen, möglicherweise falsch platzierte Daten während Migration, spezialisierten Code Ihrerseits, etc.). Einige Gedanken:

  1. Für fast jedes Web-basierte Projekt mit sogar minimale Kapazität, 2000 Zeilen ist fast nichts. Sogar pro Tag. Nach einem ganzen Jahr sind das nur 730.000 Zeilen. Wenn Sie für Ihr Zugriffsmuster geeignete Schemaindizes und normalization annehmen, wird dies für ein RDBMS immer noch als vernachlässigbar angesehen.
  2. Wenn Sie wirklich für sharding planen müssen, betrachten Sie vielleicht tun es auf der jährlichen oder dekadischen Ebene. 730K * 10 Jahre ist nur 7.3M Zeilen, die in der Regel immer noch betrachtet im Bereich der vernachlässigbar (richtige Normalisierung und Indizes gegeben).

Wenn der vorgängigen auf diese Frage ist, dass Sie Geschwindigkeitsprobleme stoßen, dann empfehle ich Ihnen schwer, über Ihr Datenmodell des normalization, und darüber nachdenken, wo Sie hinzufügen müssen Indizes denken müssen. Wenn Ihr Standarddatenmodell beispielsweise nicht die richtigen Indizes bietet, verwenden Sie @ lodb's (schnelle Finger!) Vorschlag und manuell Django ORM, um Indizes zu erstellen:

class Meta: 
    indexes = [ 
     models.Index(fields=['day',]), 
    ] 
+0

Vielen Dank für diese Erklärung. Obwohl die täglichen Datensätze manchmal größer waren als ursprünglich angenommen, habe ich jetzt ungefähr 13 Millionen Datensätze in einer Tabelle, aber das ist in Ordnung. Die Tabelle wird nur 1-2 Mal am Tag abgefragt, um eine Berechnung durchzuführen und eine Grafik zu erstellen. Es erfordert auch nur einen kleinen Teil der Datensätze. Die Geschwindigkeit ist nicht so wichtig, in diesem Fall ist es die beste Lösung. – MK87

4

Ehrlich gesagt, ist eine Tabelle pro Tag nicht der beste Weg, in Django zu gehen, wie es den ganzen Rahmen verwenden viel machen würde härter:

  • würden Sie jeden Tag ein neues Modell erstellen müssen
  • Sie würden makemigrations müssen und jeden Tag
  • wandern oder würden Sie überspringen die ORM mit insgesamt

Wenn die Geschwindigkeit ist der Grund, warum Sie eine Tabelle pro Tag halten würde, würde ich ein tabl verwenden nur e, mit einem Datenbankindex auf dem Tagesfeld. Es könnte ein bisschen langsamer sein, aber es wird dein Leben viel einfacher machen.

Sie müssen dies Ihr Modell-Definition hinzuzufügen:

class Meta: 
    indexes = [ 
     models.Index(fields=['day',]), 
    ] 

Das Handbuch es im Detail erklärt: https://docs.djangoproject.com/en/1.11/ref/models/indexes/

Verwandte Themen