Hallo,
ich bin gerade irgendwie nicht in der Lage, in PostgreSQL etwa folgendes zu haben:
Ein Objekt kann beschrieben werden durch eine Reihe von Attributen
Name ist Text Size ist ein Integer Colors ist ein Set von Werten aus dem Bereich 'red', 'green', 'blue'
Also:
Name|Sz.|Colors -------+---+-------- Foo|12 |red Bar|10 |red,blue Baz|7 |green Baf|42 |green,blue
CREATE TYPE colors AS ENUM ('red', 'green', 'blue'); -- so stelle ich mir das vor: CREATE TYPE colors AS SET ('red', 'green', 'blue');
Aber so geht das nicht. Wie dann? MySQL kann doch Mengen, oder?
Konnte ich mich verständlich ausdrücken? Danke.
Best regards from Dresden/Germany Viele Grüße aus Dresden Heiko Schlittermann
Am 23.07.2014 um 23:32 schrieb Heiko Schlittermann:
Hallo,
ich bin gerade irgendwie nicht in der Lage, in PostgreSQL etwa folgendes zu haben:
Ein Objekt kann beschrieben werden durch eine Reihe von Attributen Name ist Text Size ist ein Integer Colors ist ein Set von Werten aus dem Bereich 'red', 'green', 'blue' Also: Name|Sz.|Colors -------+---+-------- Foo|12 |red Bar|10 |red,blue Baz|7 |green Baf|42 |green,blue CREATE TYPE colors AS ENUM ('red', 'green', 'blue'); -- so stelle ich mir das vor: CREATE TYPE colors AS SET ('red', 'green', 'blue'); Aber so geht das nicht. Wie dann? MySQL kann doch Mengen, oder?
Konnte ich mich verständlich ausdrücken?
Du kannst eine Spalte als Array definieren[1], was so ungefähr das ist, was Du Dir vorstellst.
Man könnte es aber auch so machen -- so wie man es auf der Schule lernt ;)
CREATE TABLE item ( id serial primary key, name varchar(100) );
CREATE TYPE colorz AS ENUM ('red', 'green');
CREATE TABLE item_options( id serial primary key, item_id integer references item, size integer, color colorz );
Damit sparst Du Dir die Array-Spezifika, trittst Du Dir aber eine Menge an Joins ein.
Ist am Ende halt eine Frage, was Du damit machen willst und wie die Querys aussehen sollen.
Gruß Frank
Hallo Frank,
danke für die schnelle Antwort. …
CREATE TYPE colorz AS ENUM ('red', 'green');
CREATE TABLE item_options( id serial primary key, item_id integer references item, size integer, color colorz );
Damit sparst Du Dir die Array-Spezifika, trittst Du Dir aber eine Menge an Joins ein.
Ist am Ende halt eine Frage, was Du damit machen willst und wie die Querys aussehen sollen.
Ja, ich möchte alle Items haben, die blau in den colors haben, oder eben rot. Also wird das wohl mit der extra Tabelle das sein, was natürlicher daherkommt:
Oder wissen, wie viele Items gruen, oder rot sind.
Danke
Heiko Schlittermann hs@schlittermann.de hat am 23. Juli 2014 um 23:32 geschrieben:
Hallo,
ich bin gerade irgendwie nicht in der Lage, in PostgreSQL etwa folgendes zu haben:
Ein Objekt kann beschrieben werden durch eine Reihe von Attributen Name ist Text Size ist ein Integer Colors ist ein Set von Werten aus dem Bereich 'red', 'green', 'blue'
Also:
Name|Sz.|Colors -------+---+-------- Foo|12 |red Bar|10 |red,blue Baz|7 |green Baf|42 |green,blue
CREATE TYPE colors AS ENUM ('red', 'green', 'blue'); -- so stelle ich mir das vor: CREATE TYPE colors AS SET ('red', 'green', 'blue');
Aber so geht das nicht. Wie dann? MySQL kann doch Mengen, oder?
Mir scheint, Du suchst sowas wie:
test=# create type colors as enum ('red','green', 'blue'); CREATE TYPE test=*# create table foobar (id int, color colors[]); CREATE TABLE test=*# insert into foobar values (1, array['red'::colors, 'blue'::colors]); INSERT 0 1 test=*# select * from foobar; id | color ----+------------ 1 | {red,blue} (1 row) test=*# select id, array_to_string(color,',') as color from foobar; id | color ----+---------- 1 | red,blue (1 row)
Also, erst einmal den Typ als ENUM und davon dann ein ARRAY.
Warum magst Du keine normalisierte Speicherung hier?
Andreas Kretschmer andreas@a-kretschmer.de (Mi 23 Jul 2014 23:50:53 CEST):
Mir scheint, Du suchst sowas wie:
test=# create type colors as enum ('red','green', 'blue'); CREATE TYPE test=*# create table foobar (id int, color colors[]); CREATE TABLE test=*# insert into foobar values (1, array['red'::colors, 'blue'::colors]); INSERT 0 1 test=*# select * from foobar; id | color ----+------------ 1 | {red,blue} (1 row) test=*# select id, array_to_string(color,',') as color from foobar; id | color ----+---------- 1 | red,blue (1 row)
Also, erst einmal den Typ als ENUM und davon dann ein ARRAY.
Weil das so etwas schöner aussähe:
SELECT name FROM items WHERE colors CONTAINS 'red';
Wie in der anderen Antwort beschrieben, wird es wohl tatsächlich die normalisierte Darstellung werden, und keine Arrays.
Danke für die schnelle Hilfe.
Am 23.07.2014 um 23:58 schrieb Heiko Schlittermann:
Andreas Kretschmer andreas@a-kretschmer.de (Mi 23 Jul 2014 23:50:53 CEST):
Mir scheint, Du suchst sowas wie:
test=# create type colors as enum ('red','green', 'blue'); CREATE TYPE test=*# create table foobar (id int, color colors[]); CREATE TABLE test=*# insert into foobar values (1, array['red'::colors, 'blue'::colors]); INSERT 0 1 test=*# select * from foobar; id | color ----+------------ 1 | {red,blue} (1 row) test=*# select id, array_to_string(color,',') as color from foobar; id | color ----+---------- 1 | red,blue (1 row)
Also, erst einmal den Typ als ENUM und davon dann ein ARRAY.
Weil das so etwas schöner aussähe:
SELECT name FROM items WHERE colors CONTAINS 'red';
Wie in der anderen Antwort beschrieben, wird es wohl tatsächlich die normalisierte Darstellung werden, und keine Arrays.
Kannst Dir ja ungefähr so etwas
SELECT i.name, io.color, io.size FROM item as i, item_options as io WHERE i.id = io.item_id
in eine View packen. Dann kannst Du wie oben drauf zugreifen. Jetzt wahrscheinlich nicht das schnellste was wo geht, aber wat solls ;D
Gruß Frank
lug-dd@mailman.schlittermann.de