2016-11-27 4 views
0

Nehmen wir an, ich habe drei Arten von Daten: A 's, B' s und C 's. A sieht wie folgt aus:Wie sortiere ich Feeds verschiedener Typen in PostgreSQL am besten?

{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "created_at": "2016-11-27 02:24:12.889637+00", 
    "author": "7d16389b-2d66-4c59-bb6a-87992a60d112", 
    "foo": "bar", 
    "baz": "zab", 
    "nak": "kan" 
} 

und C sieht wie folgt aus:

{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "created_at": "2016-11-27 02:24:12.889637+00", 
    "author": "7d16389b-2d66-4c59-bb6a-87992a60d112", 
    "baz": "zab", 
    "cat": "dog" 
} 

Es gibt (eher klein) Variationen in ihren Feldern, aber sie haben

{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "created_at": "2016-11-27 02:24:12.889637+00", 
    "author": "7d16389b-2d66-4c59-bb6a-87992a60d112", 
    "foo": "bar", 
    "baz": "zab", 
    "cat": "dog" 
} 

B wie folgt aussieht einige konsistente Felder (sozusagen "Metadaten"). Jede von ihnen stellt ihren eigenen Datentyp dar - B ist nicht A mit verschiedenen Feldern. Jedoch zu einem späteren Zeitpunkt muß ich die jüngsten alle drei in ein „Futter“ kombinieren:

[{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "type": "A", 
}, 
{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "type": "B", 
}, 
{ 
    "id": "4ccdfb68-ce18-4361-bd90-e61f1fcf8d2b", 
    "type": "C", 
}] 

Soll ich eine einzelne Tabelle alle drei mit ihren gemeinsam genutzten Feldern erstellen darstellt und ein JSONB Feld, oder sollten sie eigene Tabellen haben und eine Gewerkschaftsabfrage an ihnen durchführen? Um es klar zu sagen, der Feed hat nur gemeinsame Felder. Ich brauche das auch, um vorwärtskompatibel zu sein - ich weiß in der Tat, dass zukünftige Typen eine ID, ein created_at-Feld und einen Autor haben werden, aber darüber hinaus ist es faires Spiel.

Danke! Fühlen Sie sich frei, nach Details zu fragen.

Bearbeiten: Ah, ja, ich vergaß zu erwähnen, dass ich auch (zu einem späteren Zeitpunkt) Indizes auf ein Feld machen möchte (wenn die Zeile es hat), so dass ich nach allen Zeilen suchen kann, wo "foo "==" bar ". Wenn eine Zeile nicht foo hat, sollte das nicht brechen.

Antwort

0

Ich habe aus mehreren Gründen mit einer einzigen Tabelle gehen gewählt:

  1. JSONB für diese Situation ist perfekt - ich ein paar Spalten habe ich auf alles wollen, aber der Rest ist dynamisch.
  2. Ich kann immer noch Indizes für die JSONB-Daten (für den Typ der Daten) machen.
  3. Ich kann den Feed absteigend durch eine Spalte in einem Index bestellen und alle Schlüssel in der gleichen Tabelle sein.
  4. Ich kann separate, verwandte Tabellen (Kommentare) kombinieren.
  5. Es macht insgesamt mehr Sinn. Hier

ist die Tabellenbeschreibung:

          Table "public.feed" 
    Column |   Type   |       Modifiers       
------------+--------------------------+--------------------------------------------------------------- 
id   | uuid      | primary key unique not null 
created_at | timestamp with time zone | not null default now() 
created_by | uuid      | not null default '00000000-0000-0000-0000-000000000000'::uuid 
data  | jsonb     | 
Indexes: 
    "feed_pkey" PRIMARY KEY, btree (id) 
    "feed_created_at_index" btree (created_at DESC) 
    "feed_data_index" btree (data) 
    "text_index" gin (to_tsvector('english'::regconfig, data ->> 'text'::text)) 
+0

Ich habe vergessen, eine 'Spalte Baumuster zur aufzunehmen. Es existiert :) – AniSkywalker

Verwandte Themen