4 Stimmen

80 3 Spaltenreihen, oder 1 81 Spaltenreihen

Ich habe einige Daten zu speichern,

Ich muss diese Daten für jeden Benutzer speichern,

Die Daten sind mehr oder weniger

key: 0  
value: 107,

key: 1  
value 213

Es gibt etwa 80 Schlüssel/Wertesätze pro Benutzer

Meine Frage ist also,

Habe ich eine Zeile, die im Grunde genommen

user_id key1, key2... key80

oder habe ich 80 Zeilen mit

user_id, key, value

Daten, die ich speichern muss:
Sie können die tatsächlichen Daten, die ich speichern muss, hier sehen: http://219.89.41.169/ReachApi/?gt=The%20hailwood

Ich kann nicht einfach kopieren/einfügen, da es sich um ca. 8 MB Daten handelt, so dass das Laden der Seite eine Weile dauern kann.

Aber wie Sie sehen können, bekomme ich die Daten in diesem Format, Deshalb muss ich sie auf diese Weise speichern.

2voto

dhh Punkte 4196

Sie sollten Ihren ersten Ansatz verwenden - eine Reihe von

user_id | key | value

Auf diese Weise sind Sie flexibler, wenn Sie mehr oder weniger Schlüssel pro Benutzer benötigen.

2voto

cHao Punkte 81921

Normalerweise würde ich bei dem Gedanken an 81 Spalten in einer Tabelle erschaudern. Aber IF:

  • Die Anzahl der Schlüssel/Felder wird sich wahrscheinlich nicht ändern, UND
  • Alle Felder beziehen sich direkt auf den Benutzer und gelten für jede Benutzer, und/oder
  • Es ist wahrscheinlich, dass Sie für einen bestimmten Benutzer mehr als einen Schlüssel gleichzeitig abfragen müssen,

dann ist es sinnvoller, so viele Spalten zu haben, als jede Benutzer/Schlüssel-Kombination in einer eigenen Zeile zu speichern. Sie erhalten Typsicherheit, die Möglichkeit, Ihre Daten besser einzuschränken und zu indizieren, und Sie können die Statistiken eines Benutzers abfragen, ohne ein Dutzend Joins zu benötigen (oder ein Bündel von Zeilen zurückzubekommen, die Sie dann in einer Datenstruktur zusammensetzen müssen).

Wenn sich die Anzahl der Felder ständig ändert oder die Felder nicht für alle gelten (d. h. einige Benutzer haben eine unterschiedliche Anzahl von Feldern) oder Sie nie mehr als den Wert von Benutzer 3225 für Feld 53 wissen wollen, dann ist eine Benutzer/Schlüssel/Wertetabelle sinnvoller. Aber es wird mühsam sein, alles korrekt zu halten, Aktualisierungen würden ewig dauern (weil Indizes neu erstellt werden müssten und benötigen Sie Indizes ), und die Abfragen werden unübersichtlich, wenn Sie mehr als ein oder vielleicht zwei Felder auf einmal benötigen.

2voto

Sebastian Punkte 4712

Ich habe mir die Daten angeschaut. Warum denken Sie überhaupt daran, die Daten in einer Datenbank zu speichern? Ich nehme an, Sie wollen die Daten lesen, einen Algorithmus darauf anwenden und ein Ergebnis berechnen, richtig? Oder ist es tatsächlich erforderlich, die Daten dauerhaft zu speichern, oder ist das sogar alles, was Sie versuchen zu tun?

Ihre Listen scheinen alle das folgende Format zu haben:

[KillsByEnemyTypeClass] => Array
                    (
                        [0] => stdClass Object
                            (
                                [Key] => 0
                                [Value] => 0
                            )
                        ...

[MedalCountsByType] => Array
                    (
                        [0] => stdClass Object
                            (
                                [Key] => 0
                                [Value] => 0
                            )

Wie das Datenformat andeutet, handelt es sich bei den Listen um aufeinanderfolgende Arrays und nicht um Schlüssel-Wert-Paare. Da die Schlüssel alle fortlaufend sind, können Sie die Werte in einem großen Array in einer Programmiersprache Ihrer Wahl speichern.

Dies ist Ihr Datenformat:

struct Data {
    std::string reason;
    int status;

    struct AiStatistics {
         int aDeathsByDamageType[82];
         int nHopperId;
         int aKillsByDamageType[82];
         int nMapId;
         double fMedalChestCompletionPercentage;
         int aMedalCountsByType[128];
         int nTotalMedals;
         int nVariantClass;
         ...
    } aaistatistics[9]; 
}

Es sieht so aus, als ob die Felder eine statische Größe haben müssen, denn die 82 verschiedenen Schadensarten werden Ihnen wahrscheinlich etwas sagen. Wenn es plötzlich 83 Schadensarten gibt, hat sich das Programm, das diese Daten generiert, geändert, und Sie müssen Ihre Algorithmen ebenfalls anpassen. Das bedeutet, dass die Daten und Ihr Programm nicht unabhängig sind und die Vorteile der Verwendung einer Datenbank fragwürdig sind.

更新情報

Vielen Dank für die Klarstellung Ihrer Anforderungen. Ich verstehe jetzt, warum Sie die Daten für andere Kunden zwischenspeichern müssen.

Aber: Sind die Daten, die Sie verknüpft haben, alle Daten, die Sie speichern müssen? Das heißt, Sie zwischenspeichern nur die Ausgabe der Web-API, und wenn sich die Ausgabe ändert, überschreiben Sie die zuvor gespeicherten Daten? Oder gibt es eine zeitliche Dimension und Sie wollen die Abfolge der Ausgaben der API speichern? In beiden Fällen könnte eine dünne C++-API um die binären Daten herum viel effizienter sein als eine Datenbank.

Wenn es nur für die Zwischenspeicherung der Daten, würde ich immer noch vorschlagen, die Datenbank nach dem Objektmodell oben zu modellieren. Die AI-Statistik-Tabelle hat eine Spalte pro Mitgliedsvariable, d.h. eine Spalte für das komplette DeathsByDamageType-Array. Speichern Sie das gesamte Array als einen Wert. Clients können mit diesem Modell nicht einen einzelnen Wert nachschlagen, sondern müssen das gesamte Array erhalten. Wenn Sie keinen konkreten Anwendungsfall für etwas anderes haben, würde ich bei diesem Modell bleiben. Ihre Datenbank wird viel einfacher sein.

Wenn dies für Ihre Zwecke wirklich nicht ausreicht, dann sind es wahrscheinlich Ihre Tabellen:

table Data { id, reason, status }
table AiStatistics { id, data_id, ..., all integer members like nTotalMedals etc }
table DeathByDamageType { aistat_type, index, value }
table ... for every other array member of AiStatistics

Standardmäßig ist die Speicherung von DeathByDamageType auf diese Weise wirklich platzraubend, die Tabelle ist mindestens dreimal so groß wie die Array-Werte, da für jeden Wert die AiStatistics-Referenz-ID und der Array-Index separat gespeichert werden müssen.

Wenn Sie es auf diese Weise tun, nutzen Sie zumindest die Sparsamkeit in den Arrays und speichern Sie keine Werte in DeathByDamageType, die 0 sind. Sie könnten dies nicht mit dem Array tun.

1voto

Andy White Punkte 83877

Ich würde mich von 81 Spalten in einer Datenbanktabelle fernhalten, vor allem für Dinge wie diese, bei denen Sie in Zukunft wahrscheinlich weitere "Schlüssel" hinzufügen werden (in diesem Fall müssten Sie der Tabelle weitere Spalten hinzufügen).

"Key-Value"-Tabellen können zu Leistungsproblemen führen und das Schreiben von Abfragen erschweren. Daher könnte es von Vorteil sein, wenn Sie die Schlüssel irgendwie in zusammenhängende Teile gruppieren können, die Sie dann in kleinere, konkretere Tabellen packen können.

1voto

Pro 80 Säulen

  • eine Einfügung beim Anlegen eines Benutzers und nur Aktualisierungsanweisungen für Änderungen
  • der Vergleich der Werte von zwei oder mehr Schlüsseln kann mit einfachen SELECT-Anweisungen erfolgen (ohne Verwendung von Self-Joins)
  • O/R-Mapping funktioniert sofort nach dem Auspacken
  • die Datenbank kann die Typenprüfung durchführen

Pro 80 Reihen

  • das Hinzufügen von Schlüsseln ist nur eine Einfügung, es ist kein ALTER TABLE erforderlich (was bei einer großen Anzahl von Benutzern eine lange Ausfallzeit bei Aktualisierungen bedeutet)
  • Plugins können leicht ihre eigenen Konfigurationseinstellungen hinzufügen (vorausgesetzt, die Schlüsselnamen enthalten eine Art Präfix, um Konflikte zu vermeiden)

Kommentare zu 80 Zeilen

  • Wenn Sie diesen Ansatz verwenden, schlage ich vor, "key_id" anstelle von "key" zu verwenden und eine zweite Tabelle für Schlüssel zu haben, damit die Schlüsselnamen validiert werden können. Diese Tabelle kann eine dritte Spalte für die Dokumentation enthalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X