2017-06-29 5 views
0

je travaille sur une base de données postgresql et j'ai un problème:postgresql entier clé étrangère [] fait référence à un nombre entier

Je veux créer un demandeur de table avec categories_ids de colonne (cela signifie que le demandeur peut avoir plusieurs categories) et je veux créer une contrainte de clé étrangère entre cette colonne et l'id de colonne de la table des catégories. Mais pgadmin dit qu'il est impossible:

foreign key constraint "fk_categories_ids" cannot be implemented 
DÉTAIL : Key columns "categories_ids" and "id" are of incompatible types: integer[] and integer. 

EDIT 1:

CREATE TABLE public.applicants 
(
-- Hérité(e) from table users: id integer NOT NULL DEFAULT nextval('users_id_seq'::regclass), 
-- Hérité(e) from table users: email character(60) NOT NULL, 
-- Hérité(e) from table users: "firstName" character(50) NOT NULL, 
-- Hérité(e) from table users: "lastName" character(50) NOT NULL, 
-- Hérité(e) from table users: password character(50) NOT NULL, 
-- Hérité(e) from table users: role_id integer NOT NULL DEFAULT nextval('users_role_id_seq'::regclass), 
    home boolean NOT NULL, 
    "fullTime" boolean, 
    "partTime" boolean NOT NULL, 
    freelance boolean NOT NULL, 
    internship boolean NOT NULL, 
    "minSalary" integer, 
    domain_id integer, 
    categories_ids integer[], 
    skills_ids integer[], 
    locations_ids integer[], 
    "jobExperiences_ids" integer[], 
    CONSTRAINT pk_applicant_id PRIMARY KEY (id), 
    CONSTRAINT fk_domain_id FOREIGN KEY (domain_id) 
     REFERENCES public.domains (id) MATCH SIMPLE 
     ON UPDATE NO ACTION ON DELETE NO ACTION 
) 
INHERITS (public.users) 
WITH (
    OIDS=FALSE 
); 
+2

Ceci n'est simplement pas supporté. Normaliser votre modèle de données, alors vous pouvez créer une clé étrangère correcte –

+0

oui mais je ne sais pas comment modéliser ce comportement je commence vraiment à travailler sur des bases de données pourriez-vous me montrer comment je pourrais faire? –

+0

Vous êtes à la recherche d'une «relation un-à-plusieurs» en design relationnel –

Répondre

0

Supprimer le champ categories_ids integer[] et:

create table applicant_category (
    applicant_id int references applicants(id), 
    category_id int references category(category_id), 
    primary key (applicant_id, category_id) 
) 
+0

merci cela a très bien fonctionné :) –

+0

Ceci est l'approche traditionnelle, EAV. Cela peut être pire ou peut être meilleur, selon les circonstances concrètes. – Nick

0

Vous ne pouvez pas créer FK sur la colonne de tableau. Non supporté. Utilisez donc le modèle EAV (https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model, donc 3 tables au lieu de 2) ou travaillez sans clé étrangère (vous pouvez créer des déclencheurs personnalisés pour les émuler, cependant).

Il y a quelques articles comparant EAV à l'utilisation "non primitifs" (int[], hstore, jsonb) types de données - par exemple http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/ et https://wiki.hsr.ch/Datenbanken/files/Benchmark_of_KVP_vs.hstore-_doc.pdf ont quelques points de repère.