2017-12-17 1 views
0

Ich arbeite an einem Projekt, bei dem jeder Benutzer über ein Inventar verfügt, bei dem es sich eigentlich nur um ein Array von IDs handelt, die den tatsächlichen Dingen im Projekt entsprechen.Speichern eines Arrays mit sich wiederholenden Elementen

Um das Inventar zu speichern, möchte ich Postgres verwenden und Daten einfach in ein Zeichenfolgenformat serialisieren/deserialisieren. In diesem Array ist es jedoch wahrscheinlich, dass sie viele einzelne IDs haben. Die IDs sind alle Ganzzahlen, daher plane ich, sie nur mit einem Komma zu verbinden und sie während des Abrufens zu trennen.

Zum Beispiel könnte das Inventar [1, 2, 3, 3, 3, 4] sein, aber es wäre am besten, es nicht wie 1,2,3,3,3,4 mit einer langen wiederholenden Liste zu speichern.

Gibt es eine effiziente Möglichkeit, doppelte Artikel zu speichern?

+0

Wenn Sie die Daten speichern ist String-Format, warum nicht konvertieren Sie es in JSON, die von der neuesten Postgres DB unterstützt wird? – Nishant

+0

Oh, wusste nicht, dass es existiert. Nun, selbst wenn ich es als JSON-Array speichern würde, würde ich es trotzdem gerne komprimieren. Ich denke ich habe eine Lösung, werde es als Antwort posten. – Punknoodles

+2

PostgreSQL unterstützt auch Array-Spalten, so dass Sie eine 'int []' Spalte verwenden können. Oder verwenden Sie einfach eine separate Tabelle, damit Sie in Ihrer Datenbank die richtige referenzielle Integrität haben. Wie groß sind diese Arrays und wie viele Duplikate haben sie, dass diese Art der Optimierung notwendig ist? –

Antwort

1

"Aktuelle Dinge im Projekt" sollte eine andere Tabelle in der Datenbank sein. Der richtige relationale Ansatz ist eine Verknüpfungstabelle haben:

create table userItems as (
    userItemId serial primary key, 
    userId int references users(userId), 
    itemId int references items(itemId) 
); 

Sie können dann zusätzliche Informationen hinzufügen - wie Menge, Preis, Datum, hinzugefügt, und so weiter.

Es gibt einige Umstände, unter denen ein Array geeigneter wäre. Für alltägliche Situationen, in denen Sie Benutzer und Elemente haben, wäre eine Junction-Tabelle der erste Ansatz und würde Ihr Problem wahrscheinlich lösen.

+0

Das Problem dabei ist, dass die "eigentlichen Dinge im Projekt" nicht in der Datenbank sind. Ich habe einige Funktionen, die die IDs in aussagekräftige Daten für die Anwendung konvertieren, so dass das Speichern der Elemente in der Datenbank nicht sinnvoll ist. – Punknoodles

0

Dank Nishant wurde mir klar, dass ich das Array stattdessen im JSON-Format speichern kann. Damit kann ich die Kompression wie folgt tun (die ursprüngliche Eingang verwenden):

{ 
    "1": 1, 
    "2": 1, 
    "3": 3, 
    "4": 1 
} 

Welche mir erlauben, zu speichern, nur eine Zählung von jedem Element in der JSON.

EDIT: Hier ist der Code.

function(array) { 
    output = {}; 
    array.forEach((x) => { 
     output[x] = (output[x] || 0) + 1 
    }); 
    return output; 
} 
Verwandte Themen