2017-03-27 4 views
1

Ich erstelle Tabellen für eine Datenbank (mit Redshift), um die Ereignisse mehrerer mobiler Apps zu speichern, die aus mehreren Quellen wiederhergestellt werden. Problem ist, dass es nicht sehr benutzerfreundlich/explizit ist, da es sie zwingt, Abfragen in mehrere Tabellen zu machen, um die Werte der Spalten wiederherzustellen, um zu verstehen, was es in den Zeilen ist, wie die meisten Daten in den Zeilen des Ereignisses Tabelle sind Ganzzahlen.Datenbankdesign: bessere lesbare Zeilen

CREATE TABLE source (
    id    serial PRIMARY KEY, 
    value   string NOT NULL 
); 

CREATE TABLE application (
    id    serial PRIMARY KEY, 
    value   string NOT NULL 
); 

CREATE TABLE platform (
    id    serial PRIMARY KEY, 
    value   string NOT NULL 
); 

CREATE TABLE country (
    id    serial PRIMARY KEY, 
    value   string NOT NULL 
); 

CREATE TABLE event (
    id    serial PRIMARY KEY, 
    source_id  integer REFERENCES source(id), 
    application_id integer REFERENCES application(id), 
    platform_id  integer REFERENCES platform(id), 
    country_id  integer REFERENCES country(id), 

    ... 

    updated_at  date NOT NULL, 
    value   decimal(100, 2) NOT NULL 
); 

Zum Beispiel dachte ich, die ENUM Art der Verwendung direkt um die Werte zu erhalten, aber ich fühle mich wie es weniger flexibel ist. Glaubst du, es gibt eine alternative Lösung, die ich verwenden könnte?

Danke!

+2

Wie wäre das Erstellen einer Ansicht, wo die Tabellen verknüpft werden, so dass die Werte in der Ansicht direkt sichtbar sind? – michaeak

+1

Es ist üblich, eine de-normalisierte Schicht zu haben, die für das Reporting verwendet wird. Kimbal-Sternmodellierung ist eines der häufigsten Modellierungsmuster dafür. Auf diese Weise kann die Anwendung eine normalisierte Struktur haben und das Reporting wird vereinfacht. –

+1

Danke für Ihre Antworten. Ich dachte nicht an Ansichten, aber ich denke, es ist eine sehr einfache und effektive Lösung. Ich werde mir Kimballs Sternmodellierung ansehen. Danke noch einmal! – azekirel555

Antwort

-2

Versuchen Sie, alle wie diese

an einen Tisch zu kombinieren
CREATE TABLE Values (
    kind   integer 
    id    integer, 
    value   string NOT NULL 
); 

Satz Art und id als Primärschlüssel, können Sie Ihre einzigartige Daten von Art und ID finden und darauf zugreifen, wird Ihre Art Typ sein und ID wird spezifische ID, und beide werden einzigartige Primärschlüssel

beispielsweise Art sein kann

source = 1, 
application = 2, 
platform = 3, 
country = 4 
+0

Dies ist eine schreckliche Idee, tun Sie dies nicht, wenn Sie massive Skalierbarkeitsprobleme wollen ... – Milney