PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Ist es möglich, SQL-Ergebnisspalten aus Zeilen in einer anderen Tabelle zu benennen? (Postgres)

Dies beruht auf einem grundlegenden Missverständnis des Innenlebens von Postgres und EAV-Designs .

Wenn Sie nicht über Hunderte von verschiedenen Feldern oder einen dynamischen Satz von Attributtypen verfügen, verwenden Sie eine einzelne Tabelle mit allen Spalten - außer Datenbanknormalisierung . Spalten ohne Wert werden mit NULL gefüllt .
Null-Storage ist sehr günstig , belegt 1 Bit pro Spalte in der Tabelle für die Null-Bitmap, typischerweise in Einheiten von 8 Bytes zugewiesen, um 64 Spalten abzudecken. Siehe:

Eine separate Zeile für eine Single zusätzliches Attribut belegt mindestens weitere 36 Bytes .

4  bytes item identifier
23 bytes heap tuple header
1  byte  padding
8  bytes minimum row data size

In der Regel mehr aufgrund von Polsterung und zusätzlichem Overhead.

Es müsste Hunderte von verschiedenen, spärlich gefüllten Spalten geben, bevor sich ein so unhandliches EAV-Design auszahlen könnte – und hstore oder jsonb in Postgres 9.4 wären bessere Lösungen dafür da . Dazwischen ist kaum Platz für Ihr Design und wenn wäre, würden Sie wahrscheinlich einen enum für den Typ.

Gleichzeitig sind Abfragen komplizierter und teurer. Wir sind hier in einer schwierigen Lage.

Verwenden Sie stattdessen ein Tabellenlayout wie dieses:

CREATE TABLE users (
   users_id serial PRIMARY KEY
 , salutation text
 , given_name text
 , surname text
 , alias text
 ... (many) more columns
);

CREATE TABLE address (
   address_id serial PRIMARY KEY
 , users_id int REFERENCES users
 , city text  -- or separate TABLE city incl region_id etc. ...
 , region_id int REFERENCES region
 , address  text
 ... (many) more columns
);

Eng verwandte Antwort mit mehr Ratschlägen: