Frage

Ich habe eine Tabelle, die Werte von Quelldateimetriken über Projektrevisionen hinweg darstellt, wie folgt:

Revision FileA FileB FileC FileD FileE ...
1           45     3    12   123   124
2           45     3    12   123   124
3           45     3    12   123   124
4           48     3    12   123   124
5           48     3    12   123   124
6           48     3    12   123   124
7           48    15    12   123   124

(Die relationale Ansicht der oben genannten Daten ist unterschiedlich. Jede Zeile enthält die folgenden Spalten: Revision, DateiId, Wert. Die Dateien und ihre Überarbeitungen, aus denen die Daten berechnet werden Struktur in einem relationalen Schema.)

In 10000 Revisionen können bis zu 23750 Dateien vorhanden sein (dies ist der Fall für die Imagemagick Zeichnenprogramm). Wie Sie sehen, sind die meisten Werte zwischen aufeinanderfolgenden Revisionen gleich, sodass die nützlichen Daten der Tabelle ziemlich spärlich sind. Ich suche nach einer Möglichkeit, die Daten zu speichern, die

  • Vermeidet Replikation und nutzt den Raum effizient (derzeit erfordert die Nicht-Parse-Darstellung 260 GB (Data+Index) für weniger als 10% der Daten, die ich speichern möchte).
  • Ermöglicht mir, die Werte für eine bestimmte Überarbeitung mithilfe einer SQL -Abfrage effizient abzurufen (ohne explizit durch Überarbeitungen oder Dateien)
  • Ermöglicht mir, die Revision für einen bestimmten Metrikwert effizient abzurufen.

Idealerweise sollte die Lösung nicht von einem bestimmten abhängen RDBMS und sollte kompatibel sein mit Überwintern. Wenn dies nicht möglich ist, kann ich mit Hibernate-, MySQL- oder PostgreSQL-spezifischen Funktionen leben.

War es hilfreich?

Lösung

So könnte ich es modellieren. Ich habe die Tabelle und Dateien ausgelassen, da diese ziemlich selbsterklärend sein sollten.

CREATE TABLE Revision_Files
(
    start_revision_number   INT NOT NULL,
    end_revision_number     INT NOT NULL,
    file_number             INT NOT NULL,
    value                   INT NOT NULL,
    CONSTRAINT PK_Revision_Files PRIMARY KEY CLUSTERED (start_revision_number, file_number),
    CONSTRAINT CHK_Revision_Files_start_before_end CHECK (start_revision_number <= end_revision_number)
)
GO

Um alle Werte für Dateien einer bestimmten Revision zu erhalten, können Sie die folgende Abfrage verwenden. Wenn Sie mit einem äußeren Join mit der Tabelle der Dateien zusammenarbeiten, erhalten Sie diejenigen, die keinen definierten Wert für diese Revision haben.

SELECT
    REV.revision_number,
    RF.file_number,
    RF.value
FROM
    Revisions REV
INNER JOIN Revision_Files RF ON
    RF.start_revision_number <= REV.revision_number AND
    RF.end_revision_number >= REV.revision_number
GO

Unter der Annahme, dass ich richtig verstehe, was Sie in Ihrem dritten Punkt wollen, können Sie alle Überarbeitungen erhalten, für die eine bestimmte Datei einen bestimmten Wert hat:

SELECT
    REV.revision_number
FROM
    Revision_Files RF
INNER JOIN Revisions REV ON
    REV.revision_number BETWEEN RF.start_revision_number AND RF.end_revision_number
WHERE
    RF.file_number = @file_number AND
    RF.value = @value
GO
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top