2017-06-29 5 views
0

arbeite ich an einer PostgreSQL-Datenbank auf Integer, und ich habe ein Problem aufgetreten:postgresql Fremdschlüssel integer [] bezieht sich

Ich möchte eine Tabelle Antragsteller mit einer Spalte categories_ids erstellen (das bedeutet, dass ein Antragsteller mehrere haben kann Kategorien) und ich möchte eine Fremdschlüsseleinschränkung zwischen dieser Spalte und der Spalten-ID der Kategorietabelle erstellen. Aber pgAdmin sagt, dass ist unmöglich:

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

Dies wird einfach nicht unterstützt. Normalisieren Sie Ihr Datenmodell, dann können Sie einen korrekten Fremdschlüssel erstellen –

+0

ja, aber ich weiß nicht, wie man dieses Verhalten modelliert Ich fange wirklich gerade an, an Datenbanken zu arbeiten Könnten Sie mir zeigen, wie ich tun könnte? –

+0

Sie suchen eine "one-to-many Beziehung" in relationalem Design –

Antwort

0

löschen categories_ids integer[] Feld und:

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

Danke, es hat sehr gut funktioniert :) –

+0

Dies ist traditioneller Ansatz, EAV. Je nach konkreten Umständen kann es schlimmer oder besser sein. – Nick

0

Sie können nicht FK erstellen auf Array-Spalte. Nicht unterstützt. Also entweder EAV-Modell (https://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model, also 3 Tabellen statt 2), oder arbeiten ohne Fremdschlüssel (Sie können jedoch benutzerdefinierte Auslöser erstellen, um sie zu emulieren).

Es gibt einige Artikel EAV Vergleich mit "nicht-primitiven" mit (int[], hstore, jsonb) Datentypen - zum Beispiel http://coussej.github.io/2016/01/14/Replacing-EAV-with-JSONB-in-PostgreSQL/ und https://wiki.hsr.ch/Datenbanken/files/Benchmark_of_KVP_vs.hstore-_doc.pdf haben einiges Benchmarks.

Verwandte Themen