Re: RE: Doppeleinträge in der postgres DB mit unique vermeiden

From: "Guido Neitzer" <guido(dot)neitzer(at)gmail(dot)com>
To: "Andreas Bauer" <andreas_bauer(at)arcor(dot)de>
Cc: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: RE: Doppeleinträge in der postgres DB mit unique vermeiden
Date: 2006-11-10 12:36:24
Message-ID: fbbe50e0611100436o49978bbfi845c8c3c40e5c59a@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

Okay, ich spiele mal "devils advocate" ... was machst Du, wenn es zwei
unterschiedliche Autoren namens "Hans Müller" gibt mit
unterschiedlichen Veröffentlichungen? Was machst Du bei Deinem Modell
wenn einer von beiden heiratet und dann "Hans Meier" heißt, weil er
den Namen seiner Frau annimmt? Darf er nicht heiraten, weil es
vielleicht schon einen Hans Meier gibt?

Noch besser: was machst, wenn ein Autor heiratet und Du den Namen
änderst? Die Bücher, die er vor seiner Verheiratung geschrieben hat,
müssen eigentlich noch unter seinem alten Autorennamen zu finden sein,
denn dieser steht ja auch auf den Büchern. Nun gibt es aber bereits
einen anderen Autoren mit dem neuen Namen?! Was dann?

Ergo: solche Einschränkungen werden Dich garantiert irgendwann beißen.
Es ist gut, wenn es nur einen Eintrag für eine physikalische Entität
gibt, aber es ist keine gute Idee, zu versuchen, etwas als "unique" zu
definieren, was offensichtlich im realen Leben nicht unique ist. Im
Namensregister sagt ja auch niemand "Nein, sie können ihr Kind nicht
Hans nennen, denn es gibt schon einen Hans Müller auf der Welt".

Versuche nie, in der Datenbank etwas darzustellen, von dem Du in der
Realität schon weißt, daß Du es nicht garantieren kannst (in dem Fall
Eineindeutigkeit eines Namens).

Für eine ISBN sehe ich das ein, da diese ja per Definition eindeutig
ist. Aber für andere Merkmale? Irgendwann beißt es Dich und Du mußt es
wieder ändern.

Deswegen nimmt man ja auch eigentlich immer ein "künstliches" Attribut
als PK, weil man dafür die Eindeutigkeit garantieren kann. Für anderes
ist das oft schwierig.

cug

On 11/10/06, Andreas Bauer <andreas_bauer(at)arcor(dot)de> wrote:
> Hallo Guido,
> >>Bist Du sicher, daß Du das wirklich willst? Für mich klingt das nach einer
> ziemlich schlechten Idee. Außer natürlich, Du kannst GARANTIEREN, daß Du nie
> >>eine Person aufnehmen willst, die den Bedingungen nicht genügt.
> >>Nur so aus Interesse: warum soll das so sein?
> Na, ich will Doppeleinträge vermeiden. Vielleicht sollte das Feld title der
> anderen t_Books Tabelle auch noch in CONSTRAINT UNIQUE
> miteinbezogen werden. Das wäre dann schon ein sehr großer Zufall, wenn es
> tatsächlich 2 identische Autorennamen, Nach- Und Vorname, und noch
> 2 identische Buchtitel gäbe, wodurch ein Autor dann durch dieses UNIQUE
> eleminiert würde.
>
> Die t_books sieht so aus:
>
> create table t_books
> (
> bookid int4 primary key
> default nextval('s_books'),
> authorid int4 not null
> references t_authors(authorid)
> on delete cascade,
>
> FOREIGN KEY (authorid) REFERENCES t_authors (authorid) ON UPDATE
> CASCADE ON DELETE CASCADE,
> title varchar(127) not null,
>
> subtitle varchar(255)
>
> );
>
>
> On 11/10/06, Andreas Bauer <andreas_bauer(at)arcor(dot)de> wrote:
> > Hallo NG,
> >
> > um Doppeleinträge in der postgres DB zu vermeiden, habe ich in meinem
> > create table eingefügt:
> > CONSTRAINT con1 UNIQUE (lastname,firstname)
> >
> > Wie kann ich den UNIQUE Befehl schreiben, dass die Datensätze nicht
> > doppelt sind, bei denen die Bedingung erfüllt ist, dass der lastname
> > "und" der firstname identisch sind, also wenn in einer Zeile Bauer
> > Andreas als last- und firstname steht, dass Bauer und Andreas als
> > first- und lastname nicht noch mal in einer Zeile der Tabelle
> > eingetragen wird. Es kann ja auch eine andere Person den gleichen
> > lastname, aber einen anderen firstname haben. Da würde der CONSTRAINT
> > con1 UNIQUE (lastname,firstname) ja schon den lastname nicht zulassen,
> > oder lieg ich da falsch? Geht das überhaupt mit UNIQUE, mit einer &
> > Verknüpfung von den Feldern?
> > Die pq-query Fehlermeldung von php:
> > Warning: pg_query() [function.pg-query]: Query failed: ERROR:
> > duplicate key violates unique constraint "con1" in Kann man die
> > abschalten?
> >
> >
> > Grüße
> > Andreas
> >
> >
> >
> >
> > create table t_authors
> > (
> > authorid int4 primary key
> > default nextval('s_authors'),
> > lastname varchar(31) not null,
> > firstname varchar(31) not null,
> > CONSTRAINT con1 UNIQUE (lastname,firstname)
> >
> > );
>
> Grüße
> Andreas
>
>

--
PostgreSQL Bootcamp, Big Nerd Ranch Europe, Nov 2006
http://www.bignerdranch.com/news/2006-08-21.shtml

In response to

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Guido Neitzer 2006-11-10 12:45:20 Re: Do
Previous Message Andreas Bauer 2006-11-10 12:34:04 Re: Do