2010-05-13 4 views
9

Pour quelqu'un qui a déjà utilisé l'héritage dans PostgreSQL: cela vaut-il la peine de l'utiliser, ou plutôt de ne pas l'utiliser? Dans quelle situation l'utiliseriez-vous?Utilisation de l'héritage dans PostgreSQL

Pour être honnête, je ne suis pas tout à fait comprendre la différence entre les modèles relationnels et OO ...

+6

@ Dr.PersonPersonII Messieurs! Cela ne me dérange pas lorsque vous modifiez mes messages pour plus de clarté, mais pas lorsque vous changez la signification. A mon avis: _ "Pour être vrai, je doute un peu du mélange de modèles relationnels et OO ..." _ et _ "Je ne comprends pas complètement la différence entre les modèles relationnels et OO" _ sont des choses trop différentes ! Serait bien si vous souhaitez restaurer mes mots! Merci. –

+0

Prokofviev. Je n'avais pas l'intention de changer de sens et je ne vois pas la différence de cheveux brisés sur laquelle vous vous trouvez. À la lumière de l'extrême manque de grammaire dans votre message original (je pensais aider un locuteur non-natif), je suis dans l'incrédulité que vous pensez que j'ai quelque peu ruiné votre question brouillée et le ton fâché de votre réponse. Vous auriez simplement pu régler le "problème" en 5 secondes et tout aurait bien été. Vous pouvez changer les modifications vous-même! Je ne vais pas me déranger. –

+2

Rien de personnel! Je ne m'amuse pas beaucoup avec cette fonctionnalité StackExhange. Il me restait trop d'Orwell en 1984 ... –

Répondre

2

est agréable, mais être sûr que votre comprendre les mises en garde décrites dans le manuel avant de l'utiliser. Actuellement, la façon dont il gère les contraintes est un peu rude mais c'est sur la liste de tâches. C'est particulièrement utile avec le partitionnement. Un autre exemple d'OO hériterait de la table people pour créer une table employee. Bien sûr, l'inconvénient est qu'il n'est pas portable à d'autres rdbms, donc si vous deviez réhéberger une base de données sur un autre rdbms, vous devrez réécrire un tas de choses.

5

Probablement pas, il y a des mises en garde sur l'héritage des tables de PostgreSQL, comme aucune contrainte globalement unique, de sorte que vous perdez beaucoup de garanties de cohérence. Également écrire des requêtes performantes peut être tout un défi. Comme l'a souligné Scott, l'héritage de PostgreSQL n'est vraiment utile que pour le partitionnement de tables où il s'agit d'un compromis de performances.

Il y a 2 façons communes d'utiliser les idiomes SQL standard pour l'héritage de classe:

  • Chaque objet a une ligne individuelle dans une table superclasse, et les objets de sous-classe ont également une ligne dans une table spécifique à la sous-classe, qui fait référence aux champs de superclasse par une référence de clé étrangère. Il suffit de regrouper tous les champs de superclasse et de sous-classe dans une seule grande table et de les laisser NULL si leur valeur n'est pas applicable. Cela fonctionne particulièrement bien dans PostgreSQL, car les valeurs NULL ne consomment que 1 bit par ligne, et ajouter/supprimer des champs dans des tables existantes est très rapide (quelle que soit la quantité de données). Vous pouvez éventuellement écrire un déclencheur pour vérifier que les champs requis pour un type spécifique de classe sont présents.
+0

Désolé de ne pas avoir ton deuxième point "Mets toute la superclasse et la sous-classe ..." Était juste en train de traîner avec l'héritage et les postgres. Enfin comment obtenir les contraintes de clé étrangère pour travailler avec l'héritage? Triggers? Vérifie? Quelques manuels/liens? Merci. – Igor