Wie Foreign key definieren, aber nicht prüfen/enforcen?

Allgemeines zu PostgreSQL.

Wie Foreign key definieren, aber nicht prüfen/enforcen?

Beitragvon Bergtroll » Di 7. Aug 2012, 13:51

Liebe Postgresler,

für unseren Datamart setzen wir Postgresql ein und sind damit auch sehr zufrieden. Allerdings bleibt ein Wermutstropfen: Viele ETL-Tools und auch unsere Datenbankmodellierungstool nutzt Foreign Key Informationen, um diverse Aufgaben zu erleichtern oder überhaupt erst zu ermöglichen. Aus Performancegründen und wie im Datamart üblich, geschieht die Konsitenzprüfung der Daten im Vorfeld im ETL Tool. Das Enforcing von Schlüsseln beim Load in den Datamart führt zu erheblichen Performanceeinbußen und ist überdies unnötig. Meine Frage ist deshalb:

Gibt es in Postgres die Möglichkeit, Foreign Keys zwar zu definieren, diese aber nicht zu enforcen?

Viele Grüße,

Bergtroll
Bergtroll
Neuer Benutzer
 
Beiträge: 4
Registriert: Mi 12. Okt 2011, 12:54

Beitragvon akretschmer » Di 7. Aug 2012, 13:58

Bergtroll hat geschrieben:Liebe Postgresler,

für unseren Datamart setzen wir Postgresql ein und sind damit auch sehr zufrieden. Allerdings bleibt ein Wermutstropfen: Viele ETL-Tools und auch unsere Datenbankmodellierungstool nutzt Foreign Key Informationen, um diverse Aufgaben zu erleichtern oder überhaupt erst zu ermöglichen. Aus Performancegründen und wie im Datamart üblich, geschieht die Konsitenzprüfung der Daten im Vorfeld im ETL Tool. Das Enforcing von Schlüsseln beim Load in den Datamart führt zu erheblichen Performanceeinbußen und ist überdies unnötig. Meine Frage ist deshalb:

Gibt es in Postgres die Möglichkeit, Foreign Keys zwar zu definieren, diese aber nicht zu enforcen?

Viele Grüße,

Bergtroll


Nein, dann wäre es ja MySQL ;-)

Du kannst die Prüfung verzögern, daß diese erst am Ende der TX erfolgt:

Code: Alles auswählen
test=*# create table b1 (id int primary key);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "b1_pkey" for table "b1"
CREATE TABLE
test=*# create table b2 (i int references b1 deferrable initially deferred);
CREATE TABLE
test=*# insert into b2 values (2);
INSERT 0 1
test=*# commit;
ERROR:  insert or update on table "b2" violates foreign key constraint "b2_i_fkey"
DETAIL:  Key (i)=(2) is not present in table "b1".


Aber abschalten geht nicht.

Andreas
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon Bergtroll » Di 7. Aug 2012, 14:30

akretschmer hat geschrieben:Nein, dann wäre es ja MySQL ;-)


Oder Oracle :-P. Vielen Dank auf jeden Fall für die, für mich wenngleich auch unglückliche, Antwort.

Viele Grüße,

Bergtroll
Bergtroll
Neuer Benutzer
 
Beiträge: 4
Registriert: Mi 12. Okt 2011, 12:54

Beitragvon akretschmer » Di 7. Aug 2012, 14:39

Bergtroll hat geschrieben:Oder Oracle :-P. Vielen Dank auf jeden Fall für die, für mich wenngleich auch unglückliche, Antwort.

Viele Grüße,

Bergtroll


Naja, die Bemerkung mit MySQL kommt daher, daß MySQL Check-Constraints syntaktisch prüft. Mehr nicht.

Was genau ist denn für Dich so schlecht am Verhalten von PG? Daß es in solchen Dingen gründlich ist finde ich gerade einen wesentlichen Vorzug von PG.

Andreas
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon ads » Di 7. Aug 2012, 21:58

Greenplum (als PostgreSQL fork für Data Warehouse) enforced auf genau jenem Grund keine Foreign Keys.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support
ads
Erfahrener Benutzer
 
Beiträge: 4147
Registriert: Mi 8. Feb 2006, 11:58
Wohnort: MD

Beitragvon akretschmer » Di 7. Aug 2012, 22:16

ads hat geschrieben:Greenplum (als PostgreSQL fork für Data Warehouse) enforced auf genau jenem Grund keine Foreign Keys.


Wie jetzt, ich kann da gegen FK-Constraints verstoßen?

Andreas
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon castorp » Di 7. Aug 2012, 23:14

akretschmer hat geschrieben:Wie jetzt, ich kann da gegen FK-Constraints verstoßen?
Ja, das ist ein typisches Vorgehen in einem DWH Umfeld.
Bei Oracle kann man das auch machen. Man legt einen FK und sagt Oracle: "vertrau mir, das passt alles. Du brauchst das nicht prüfen".

Bei einem Bulk load von mehreren 100 Millionen Datensätze kann das die Ladezeit deutlich verringern. Der Vorteil gegenüber einem System ohne FKs ist, dass der Optimizer weiterhin die Existenz des Constraint für Optimierungen verwenden kann (ich glaube später eingefügte Datensätze werden trotzdem validiert, nur die exisiterenden eben nicht).

Meines Wissens bieten "alle" großen Datenbanken sowas - zumindest die, die im DWH Umfeld präsent sind (Teradata, SQL Server auf jeden Fall. Bei DB2 bin ich mir nicht sicher, aber ich glaube da geht das auch).
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'
castorp
Erfahrener Benutzer
 
Beiträge: 673
Registriert: Sa 27. Jun 2009, 22:24

Beitragvon akretschmer » Mi 8. Aug 2012, 05:31

castorp hat geschrieben:Ja, das ist ein typisches Vorgehen in einem DWH Umfeld.
Bei Oracle kann man das auch machen. Man legt einen FK und sagt Oracle: "vertrau mir, das passt alles. Du brauchst das nicht prüfen".

Bei einem Bulk load von mehreren 100 Millionen Datensätze kann das die Ladezeit deutlich verringern. Der Vorteil gegenüber einem System ohne FKs ist, dass der Optimizer weiterhin die Existenz des Constraint für Optimierungen verwenden kann (ich glaube später eingefügte Datensätze werden trotzdem validiert, nur die exisiterenden eben nicht).

Meines Wissens bieten "alle" großen Datenbanken sowas - zumindest die, die im DWH Umfeld präsent sind (Teradata, SQL Server auf jeden Fall. Bei DB2 bin ich mir nicht sicher, aber ich glaube da geht das auch).


Okay, das war/ist mir neu.

Andreas
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5936
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon ads » Mi 8. Aug 2012, 21:27

Genau wie castorp sagt: im Data Warehouse Umfeld sind deine Daten in der Regel maschinell generiert.
Dich interessiert maximal die Beziehung der Daten untereinander.

In einem OLTP-Umfeld, wo du sehr häufig mit Menschen interagierst, sieht das komplett anders aus.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören Bild

Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

PostgreSQL Service & Support
ads
Erfahrener Benutzer
 
Beiträge: 4147
Registriert: Mi 8. Feb 2006, 11:58
Wohnort: MD

Beitragvon hkocam » Sa 11. Aug 2012, 22:33

hkocam
Benutzer
 
Beiträge: 79
Registriert: Do 31. Mai 2007, 23:45

Nächste

Zurück zu Allgemeines

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste