Als Array oder doch als Tabelle?

Hallo PG Community,

zu Arrays steht im Handbuch folgendes:

Tipp: Arrays sind keine Mengen. Die Verwendung von Arrays in der beschriebenen Art und Weise ist oft ein Zeichen, dass die Datenbank falsch entworfen wurde. Das Arrayfeld sollte normalerweise als eigene Tabelle abgetrennt werden. Tabellen können Sie logischerweise ganz einfach durchsuchen.

WARUM?

Meine Frage ist soll man anstatt eines Array eine Tablle anlegen?
Ich habe mom folgende Tbl, die ich eigentlich mit einem Array umsetzen wollte.
Doch kann es wohl auch so bleiben -?

CREATE TABLE Warengruppe_d_Lief
(
    ID    serial,
    Lief_ID    integer NOT NULL REFEENCES [...],
    WG_Name    varchar NOT NULL, -- sollte es ein varchar[] sein ?
    --
    PRIMARY KEY (Lief_ID, WG_Name),
    [...]
);

Inhalt wäre wie folgt:

Gegeben - 3 Lief_ID:
1 = Malerzubehor_Maier
2 = Großhandel_XY
3 = Baumarkt_Z

Tabllen Inhalt zB:
ID - Lief_ID - WG_Name
1 - 1 - Farben
2 - 1 - Pinsel
3 - 1 - sonstiges
4 - 2 - Wandfarben
5 - 2 - Lacke
6 - 2 - Tapten
7 - 2 - Pinsel
8 - 2 - sonstiges
9 - 3 - Wandfarben d. Marke 1
10 - 3 - Wandfarben d. Marke 2
usw…

Das könnte man ja als array ablegen - doch so wie ich das verstehe soll man es ja geraden nicht machen.
Ich bin PG+SQL Anfänger und Frage mich warum ist eine Tbl besser? Im array würde ich mir zb ab der 2. Zeile mit der selben Lief_ID die integer werte für die IDs sparen können.

Ja, klar. Das ist oftmals erheblich besser.

Ich habe mom folgende Tbl, die ich eigentlich mit einem Array umsetzen wollte.
Doch kann es wohl auch so bleiben -?

CREATE TABLE Warengruppe_d_Lief
(
ID serial,
Lief_ID integer NOT NULL REFEENCES […],
WG_Name varchar NOT NULL, – sollte es ein varchar sein ?

PRIMARY KEY (Lief_ID, WG_Name),
[…]
);
[/quote]

Die ID als Primary Key reicht zu, da eindeutig.

Versuche nicht, Tabellen zu Arrays zu wandeln.

[quote]
Ich bin PG+SQL Anfänger und Frage mich warum ist eine Tbl besser?[/quote]

Weil Datenbanksysteme mit Tabellen arbeiten, in den Daten abgelegt sind. Dafür gibt es Datentypen wie z.B. auch Arrays. Wenn Du nach bestimmten Dingen suchst, dann dann geht die Suche über sauber definierte Tabellen mit RI-Beziehungen schneller und einfacher als wenn Du die RI-Bedingungen pro Datensatz in einem Array speicherst.

Andreas

>

Hallo akretschmer,

danke für die Antwort. Tabellen sollen Tabellen bleiben…

Die ID als Primary Key reicht zu, da eindeutig.

Mit diesen Primary Keys wollte ich verhindern, das ein Paar\Kombination aus Lief_ID und WG_Name doppelt angelegt werden kann. Da diese beiden Werte eine Zeile Identifizieren und sich daraus erst die ID ergibt.

Wir möchten eigentlich wissen, welchen Gruppen eine Lief_ID angehören kann - da wir ua. in einer GUI später Gruppen heraus filtern wollen, denen die Lief_ID nicht angehören kann, so dass nur mögliche Gruppen angezeigt werden.
In der Tabelle wird es so doppelte WG_Name geben - klar.

Ich habe dazu eine tbl wie folgt:

CREATE TABLE Lieferant
(
    ID serial,
    Name varchar,
    Kontakt varchar,
    [...]
    --
    PRIMARY KEY (Name),
    [...]
);

Wäre hier ein array (neue Spalte) mit den Namen der Warengruppen angebracht, die der einzelne Lieferant hat, oder sollte man da schon eine tbl nuzen s.o.? (Ich hoffe du versteht den Zusammenhang.)

Ich würde ja die ID als PK nehmen, dann kannst Du auch 2 Lieferanten ‘Müller’ haben.

Ansonsten:

neue Tabelle mit der ID des Lieferanten und der Warengruppe, für jede Warengruppe eine Zeile. Dann kannst Du ganz simpel für eine bestimmte Lieferanten-ID alle Warengruppen ermitteln.

Falls Du sowas in der Applikation mal als Array brauchst, geht immer noch sowas:

test=*# select * from foo;
 t
---
 r
 t
 f
 m
(4 rows)

Time: 0,209 ms
test=*# select array(select t from foo);
 ?column?
-----------
 {r,t,f,m}
(1 row)

Andreas

neue Tabelle mit der ID des Lieferanten und der Warengruppe, für jede Warengruppe eine Zeile

Also wie es nun ist. - Die 1. Spalte mal außer Acht gelassen.