Join: ja oder nein?

Hi,
habe mal eine Frage bezüglich DB-Struktur und welche hiervon am besten ist. Ich habe einige Kategorien, z.B.:


Kleidung => Shirt => T-Shirt

Bei der Hauptkategorie Kleidung sollten alle Kleidungsstücke angezeigt werden. Bei Shirts natürlich alle Shirts + T-Shirt und bei Shirt … :astonished:

Nun habe ich mir gedacht in der Article-Tabelle folgende Spalten hinzuzufügen anstatt eine n:m-Beziehung zu verwenden.

| first_category | second_category | third_category |

hierdurch fällt schon mal der Join weg und ich spar etwas an Resourcen.
Dafür benötige ich aber folgenden Query:

SELECT * FROM "articles" WHERE ((first_category_id = 2 OR second_category_id = 2 OR third_category_id = 2))

Ist das nun eine gute Möglichkeit die man benutzen kann oder doch lieber per Join?

Danke schon mal

Kratos

Nimm einen Join. Dann kannst du deinen Baum vor allem auch ohne Probleme um mehr Ebenen erweitern oder Artikel in andere Ebenen einhängen.

Desweiteren ist so eine doppelte Datenhaltung - speziell was einen Baum betrifft, immer sehr problematisch.

Und zum Schluß ein guter Tipp: Nimm PostgreSQL 8.4, das kann sehr gut mit derartigen Baumstrukturen umgehen.

Danke ads für die Tipps!

Hab auch gleich mal versucht auf 8.4 upzugraden. Leider funktioniert nun einiges nicht mehr. Das ganze habe ich per Installer gemanagt. Der Server startet ohne Probleme per serverctl.sh mit pgAdmin III kann ich auch darauf zugreifen. Aber in der Konsole funktioniert es nicht. Mit psql -p 5433 bekomme ich folgenden Error

sudo psql -p 5433
psql: could not connect to server: No such file or directory
        Is the server running locally and accepting
        connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5433"?

Auch in var/run/postgresql ist keine Datei vorhanden (die Datei von 8.3 hatte ich in meiner panischen Suche im Internet durch Hinweiße gelöscht. Vorher konnte ich wenigstens per psql -p 5432 darauf zugreifen.)
Liegt vielleicht das ganze daran das noch postgresql 8.3 installiert ist und dort schon die Zugriffsrechte definiert wurden und daher für 8.4 nicht verwendet werden?

Verwende Ubuntu 9.04

[EDIT]: Habe nun den postgres-client-8.4 installiert nun funktioniert anscheinend psql -p 5433, nur bekomme ich noch ein:
psql: FATAL: password authentication failed for user “andre”. Soweit ich weiß muss dies (Passwort) in der pg_hba.conf festgelegt werden, nur leider ist keine für 8.4 vorhanden.

So es funktioniert jetzt schon mal alles über der Konsole. Aber: Meine App sucht immer nach den UNIX Socket in ‘var/run/postgresql/…’,aber da ist keine Datei.

Kann ich diese irgendwie anlegen?

Du kannst dem Server sagen, wo er sie anlegen soll. unix_socket_directory, in der postgresql.conf.

Andreas

Danke Andreas, hat funktioniert. Aber ich habe leider noch ein Problem

andre@andre-desktop:~$ psql
psql: could not connect to server: No such file or directory
    Is the server running locally and accepting
    connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
andre@andre-desktop:~$ su andre
Passwort: 
andre@andre-desktop:~$ psql
psql: FATAL:  database "andre" does not exist
andre@andre-desktop:~$

Ich habe mich als Superuser angelegt

createuser --superuser andre -U postgres

Warum kann ich mich dann nicht in die DB einloggen wenn ich mich schon an meinen PC angemeldet habe sondern muss mich erneut Authentifizieren? Außerdem sucht er den Socket im default-Pfad

Installiert habe ich Postgres unter ‘/opt/PostgreSQL/8.4’
Einen Pfad Habe ich in ‘/etc/profile’ gelegt

export PATH=/opt/PostgreSQL/8.4/bin:$PATH

Meine pg_hba.conf

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
# IPv6 local connections:
host    all         all         ::1/128               md5

habe ich doch festgelegt, das sich jeder Anmelden kann ohne PW.

Wo ist denn nun diese Socke? Hint: man kann auch diese als Parameter beim psql angeben, mittels --port.

Und hast Du eine Datenbank mit diesem Namen?

Ich habe mich als Superuser angelegt

createuser --superuser andre -U postgres

>
> Warum kann ich mich dann nicht in die DB einloggen wenn ich mich schon an meinen PC angemeldet habe sondern muss mich erneut Authentifizieren?

Das regelt pg_hba.conf

> Außerdem sucht er den Socket im default-Pfad
>
> Installiert habe ich Postgres unter '/opt/PostgreSQL/8.4'
> Einen Pfad Habe ich in '/etc/profile' gelegt

Tja, da ist $irgendwas wohl falsch gelaufen. Gibt es kein fertiges Paket für Deine Distri?

> ```text
export PATH=/opt/PostgreSQL/8.4/bin:$PATH

Meine pg_hba.conf

TYPE DATABASE USER CIDR-ADDRESS METHOD

“local” is for Unix domain socket connections only

local all all trust

IPv4 local connections:

host all all 127.0.0.1/32 trust

IPv6 local connections:

host all all ::1/128 md5

>
> habe ich doch festgelegt, das sich jeder Anmelden kann ohne PW.

Hast Du auch die richtige pg_hba.conf editiert?

Hint:

```text
retschmer@tux:~$ psql test
psql (8.4.0)
Type "help" for help.

test=# show hba_file;
               hba_file
--------------------------------------
 /etc/postgresql/8.4/main/pg_hba.conf
(1 row)

test=*#

Andreas

Nein, mit den Namen Andre nicht. Aber das war nur mal so um zu zeigen das ich mich ein zweites mal anmelden muss. Danach findet es auch meine DB’en. Vor dem zweiten Auth halt Sockenfehler.


Jup, habe das richtige installiert EnterpriseDB: Download PostgreSQL Installers

Yes Sir,

root@andre-desktop:/var/lib/postgresql/8.4# sudo gedit pg_hba.conf

Ich könnte dich küssen. :wink: Stundenlanger Streß, dafür. Die Socken sind gestopft.
Es gibt bei mir zwei pg_hba.conf und die die bearbeitet habe lag in

root@andre-desktop:/var/lib/postgresql/8.4# gedit pg_hba.conf

und dein Hinweiß hat mich darauf gebracht in diesem Verzeichnis auch mal zu schauen. Und siehe da … Aber WAARRRRUMMM gibt es zwei? kotz

Ich danke euch auf jedenfall sehr! Hoffe das nächste upgrade läuft etwas einfacher.

[EDIT] Habe festgestellt das einiges (wie z.b. reload_configuration) in ‘/var/lib/postgresql/8.4/’ die dateien suchen. Mal schauen wie ich das lösen kann

Nur wenn Du weiblich, jung und hübsch bist.

Ansonsten stelle ich Dir gerne eine Rechnung.

Andreas

Ich spreche mal mit deiner Frau :wink:


Ansonsten stelle ich Dir gerne eine Rechnung.

Das allerdings ist eine gute Idee :wink: