2010-05-11 5 views
0

j'ai deux tables:problème général many-to-many (Postgresql)

CREATE TABLE "public"."auctions" (
"id" VARCHAR(255) NOT NULL, 
"auction_value_key" VARCHAR(255) NOT NULL, 
"ctime" TIMESTAMP WITHOUT TIME ZONE NOT NULL, 
"mtime" TIMESTAMP WITHOUT TIME ZONE NOT NULL, 
CONSTRAINT "pk_XXXX2" PRIMARY KEY("id"), 
); 

et

CREATE TABLE "public"."auction_values" (
"id" NUMERIC DEFAULT nextval('default_seq'::regclass) NOT NULL, 
"fk_auction_value_key" VARCHAR(255) NOT NULL, 
"key" VARCHAR(255) NOT NULL, 
"value" TEXT, 
"ctime" TIMESTAMP WITHOUT TIME ZONE NOT NULL, 
"mtime" TIMESTAMP WITHOUT TIME ZONE NOT NULL, 
CONSTRAINT "pk_XXXX1" PRIMARY KEY("id"), 
); 

si je veux créer un grand nombre à plusieurs rapports sur la auction_value_key comme ceci:

ALTER TABLE "public"."auction_values" 
    ADD CONSTRAINT "auction_values_fk" FOREIGN KEY ("fk_auction_value_key") 
    REFERENCES "public"."auctions"("auction_value_key") 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION 
    NOT DEFERRABLE; 

je reçois cette erreur SQL:

ERROR: there is no unique constraint matching given keys for referenced table "auctions" 

Question:

Comme vous pouvez le voir, je veux « auction_values ​​» à être « réutilisés » par différentes ventes aux enchères sans les dupliquer pour chaque vente ... Alors je ne veux pas une relation clé sur la champ "id" dans le tableau des enchères ...

Est-ce que je pense mal ici ou quel est le problème? ;)

Merci

Répondre

1

Vous avez besoin d'une table supplémentaire pour modéliser un many relation à plusieurs. Il contiendra les mappages entre les enchères et les enchères. Il a besoin de deux colonnes: auction_id et auction_value_id.

+0

Telle est l'approche classique de la normalisation, Bravo – stjohnroe

+0

probablement raison, mais pas nécessairement :) Peut-être que les groupes 'auction_value_key' l'ensemble de lignes de 'auction_values'? Dans ce cas, le schéma proposé n'est pas correct. – Unreason

0

Si vous voulez que le auction_values à être réutilisé par différentes ventes aux enchères, vous devez déclarer une contrainte dans l'autre sens:

ALTER TABLE auctions 
ADD CONSTRAINT fk_auction_values 
FOREIGN KEY (auction_value_key) 
REFERENCES auction_values (id) 
0

Citant le wikipedia

In the context of relational databases, a foreign key is a referential constraint between two tables. 1 The foreign key identifies a column or a set of columns in one (referencing) table that refers to set of columns in another (referenced) table. The columns in the referencing table must be the primary key or other candidate key in the referenced table. The values in one row of the referencing columns must occur in a single row in the referenced table. Thus, a row in the referencing table cannot contain values that don't exist in the referenced table (except potentially NULL). This way references can be made to link information together and it is an essential part of database normalization. Multiple rows in the referencing table may refer to the same row in the referenced table. Most of the time, it reflects the one (master table, or referenced table) to many (child table, or referencing table) relationship.

Comme Quassnoi souligne, il semble que si vous voulez avoir plusieurs lignes simples lignes auctions de référence en auction_values.

Pour cela, la table principale ou référencée est auction_values et la table enfant ou de référence est la valeur de la vente aux enchères.

Si d'un autre côté Alex a raison et que vous voulez référencer plusieurs lignes dans le auction_values, vous aurez besoin d'une autre table.

Ce tableau vous aidera à convertir la relation plusieurs-à-plusieurs (qui ne peut pas être directement réalisée au niveau de la base de données physique) en deux relations un-à-plusieurs.

En général, vous pourriez avoir dans ce magasin de table ids des deux tables de départ et de cette façon vous pouvez associer une combinaison des enregistrements de auction_values et auctions.

Cependant, cela pourrait être trop générale et vous pourriez effectivement être après une table auction_value_keys (auction_value_key)