Datenbank aktualisieren, alte Daten speichern

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Lasse
User
Beiträge: 112
Registriert: Donnerstag 3. Februar 2011, 18:25

Hallo,

ich habe eine Datenbank mit einer Tabelle, mit ungefähr solchen Datensätzen:
INSERT INTO `x_world` VALUES (132958,392,235,2,56061,'[ßarßares]',410,'ßarßare',291,'FR',20);
Die Datenbank wird einmal täglich wieder mit diesen Datensäten gefüttert, in der Zwischenzeit können sich alle Daten eines Datensatzes, bis auf die ersten 3 geändert haben. Allerdings kann auch der ganze Datensatz weggefallen sein. Solche Änderungen sollen dann mit dem Datum notiert werden. Ich will a) eine Tabelle haben in der nur die aktuellen Datensätze enthalten sind und b) Möglichkeiten die Änderungen und weggefallen Datesätze speichern, sodass ich die Veränderung eines Datensatzes zurückverfolgen kann.

Meine Idee:
-Es gibt eine Liste mit tagesaktuellen Datensätzen
-alte Datensätze die wegfallen werden in einer extra Tabelle mit dem Entfernungsdatum gespeichert
-Ändert sich eine Eigenschaft eines Datensatzes wird diese Änderung in einer Tabelle für jede Eigenschaft mit dem Datum und der ID (erste Eigenschaft) gespeichert.

Ist das geschickt? Und wie kann ich Veränderungen zwischen alter und neuer Tabelle möglichst einfach feststellen und dann in extra Tabellen speichern?

PS: Ich bin in Datenbanken totaler Anfänger.
BlackJack

@Lasse: Das klingt nach einem etwas ungewöhnlichen Entwurf. So etwas wie gleich aufgebaute Tabellen und dann Einträge zwischen Tabellen „verschieben“ macht man in relationalen Datenbankentwürfen in der Regel nicht. Da führt man eher eine Spalte oder eine Tabelle ein wo gespeichert wird wie der Datensatz zu interpretieren ist und stellt entsprechende Anfragen. Für Deine tagesaktuellen Daten würde sich zum Beispiel ein Feld mit den Datum anbieten. Wenn Du die Datensätze von heute haben möchtest fragst Du dann einfach nach den Daten mit dem heutigen Datum.

Für die Veränderungen könnte man zum Beispiel die Datensätze alle in einer Verlaufs-Tabelle speichern. Und abfragen kann man die aktuellen Werte dann entweder mittels ``GROUPBY`` oder über eine extra Tabelle in der auf die jeweils aktuellsten Einträge verwiesen wird. Beispiel:

Code: Alles auswählen

measurements:

    id      sensor_id       value   measured
    0       0               20      2011-10-01
    1       1               26      2011-10-01
    2       0               25      2011-10-02
    3       2               24      2011-10-02

current_values:

    sensor_id       measurements_id
    0               2
    1               1
    2               3
Was Du auf keinen Fall machen solltest ist variabel viele Tabellen anlegen. Die Anzahl der Tabellen sollte in einem DB-Entwurf fest sein.
Lasse
User
Beiträge: 112
Registriert: Donnerstag 3. Februar 2011, 18:25

Danke Black Jack, das klingt gut, aber ich habe z.B einen Datensatz von 3 Tagen:
INSERT INTO `x_world` VALUES (132958,392,235,2,56061,'beispiel ort',410,'beispiel spieler',291,'FR',20, '2011-10-1');
INSERT INTO `x_world` VALUES (132958,392,235,2,56061,'beispiel ort',410,'beispiel spieler',291,'FR',23, '2011-10-2');
INSERT INTO `x_world` VALUES (132958,392,235,2,56061,'geaendert ort',410,'beispiel spieler',291,'FR',23, '2011-10-3');
Es ändert sich oft nur eine Eigenschaft oder auch garkeine, da finde ich es speicherfressend immer alle Variablen zu notieren.
Wie kann ich immer nur die geänderten speichern?
BlackJack

@Lasse: Das geht im Grunde nicht. Du könntest den Datensatz so aufbauen, dass alles nur Fremdschlüssel auf Tabellen für die einzelnen Eigenschaften sind, aber das würde vom Platz her nur etwas bringen wenn der Fremdschlüssel deutlich kleiner als das Datum ist. Sonst benötigt man noch mehr Platz und ausserdem werden die Abfragen komplexer. Bei den Zeichenketten wäre das aber vielleicht eine Überlegung Wert. Beziehungsweise kann man die Daten vielleicht sowieso schon sinnvoll auf mehrere Tabellen aufteilen.

Letztlich ist es aber auch schwer etwas zu sagen, weil genau wie bei Datenstrukturen in Programmen, die erwarteten Datenmengen, Änderungen, und Zugriffsmuster wichtig sind, um eine dazu passende Struktur zu entwerfen. Was für Daten gibt es, wie hängen die zusammen, in welchen Mengen kommen die in das System, wie und wie häufig werden sie verändert, was muss wie und wie häufig aus den Daten ermittelt werden? Das sind alles Fragen die den Datenbankentwurf bestimmen.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Es ändert sich oft nur eine Eigenschaft oder auch garkeine, da finde ich es speicherfressend immer alle Variablen zu notieren.
Na ja, also rein von der Datenmenge her (in Bytes) ist das so wenig, dass du da ziemlich viel speichern kannst, ohne das die Datenbank stark wächst.

Wenn ich dein anliegen richtig interpretiere, dann würde es reichen, ein Diff zwischen dem aktuellen Datensatz und aktueller Datensatz -1 zu speichern. Dann müsstest du dir aber ggf. ein eigenes Format überlegen, weil so was mit einer relationalen DB nicht mehr sooo gut geht.

Hängt aber auch stark davon ab, wie wann was abgefragt werden soll - wie BlackJack schon sagte.

Gruß, noisefloor
Antworten