Quand utiliser hérité des tables PostgreSQL?
Dans quelles situations vous devez utiliser hérité de tables? J'ai essayé de les utiliser très brièvement et à l'héritage n'avait pas l'air dans le monde de la programmation orientée objet.
J'ai pensé qu'il a travaillé comme ceci:
Table users
qui a tous les champs sont obligatoires pour tous les niveaux de l'utilisateur. Des tableaux comme moderators
, admins
, bloggers
, etc mais les champs sont pas vérifiée à partir de la mère. Par exemple users
a champ e-mail, et a hérité de bloggers
a maintenant, mais elle n'est pas unique pour les deux users
et bloggers
en même temps. c'est à dire. même que je l'ai ajouter un champ email dans les deux tables.
La seule utilisation que je pouvais penser est les champs qui sont habituellement utilisées, comme row_is_deleted, created_at, modified_at. Est-ce la seule utilisation hérité de tables?
Vous devez vous connecter pour publier un commentaire.
Il y a quelques raisons principales pour l'utilisation de l'héritage de table dans postgres.
Permet de dire, nous avons quelques tables nécessaires pour les statistiques, qui sont créés et remplis chaque mois:
Dans cet exemple, nous avons 2.000.000 de lignes dans chaque table. Chaque table a une contrainte de VÉRIFICATION pour vous assurer que seules les données pour le mois correspondant est stocké dans il.
Donc, ce qui rend l'héritage d'une fonction cool - pourquoi est-il difficile de fractionner les données?
Pour l'utilisation correcte de l'héritage de table comme booster la performance, regardez le manuel postgresql.
Vous devez définir les contraintes de VÉRIFICATION sur chaque table pour dire à la base de données, sur lequel les clés de vos données est coupée en deux (partitionné).
Je faire un usage intensif de l'héritage de table, surtout quand il s'agit de stocker des données de journaux regroupés par mois. Astuce: Si vous stockez des données, qui ne changera jamais (journal de données), de créer ou d'index à CRÉER des INDEX SUR () AVEC(taux de remplissage=100), Ce qui signifie plus d'espace pour les mises à jour seront réservés dans l'index l'index est plus petite sur le disque.
Mise à JOUR:
taux de remplissage par défaut est de 100, à partir de http://www.postgresql.org/docs/9.1/static/sql-createtable.html:
Le taux de remplissage d'une table est un pourcentage compris entre 10 et 100. 100 (emballage) est la valeur par défaut
"L'héritage de Table" signifie quelque chose de différent que "l'héritage de classe" et qu'ils servent à des fins différentes.
Postgres est tout au sujet de la définition des données. Parfois très complexes et les définitions de données. La programmation orientée objet (dans la commune de Java-couleur sens des choses), c'est à propos de la subordination des comportements à des définitions de données dans une seule structure atomique. Le but et le sens du mot "héritage" est significativement différente ici.
En programmation orientée objet, la terre je pourrais définir (très lâche avec la syntaxe et de la sémantique ici):
Les tables pour ce qui pourrait ressembler à:
Mais où sont les comportements? Ils ne correspondent pas n'importe où. Ce n'est pas le but des "objets", comme ils sont décrits dans la base de données du monde, parce que les bases de données sont des données, pas de code procédural. Vous pourriez écrire des fonctions dans la base de données pour effectuer des calculs pour vous (souvent une très bonne idée, mais pas vraiment quelque chose qui correspond à ce cas), mais les fonctions ne sont pas la même chose que de méthodes-méthodes comme compris dans la forme de la programmation orientée objet vous parlez, sont délibérément moins souple.
Il n'y a plus qu'une chose à souligner à propos de l'héritage comme un schéma de l'appareil: Comme de Postgresql 9.2 il n'y a pas moyen de faire référence à une contrainte de clé étrangère sur toutes les partitions/tableau des membres de la famille à la fois. Vous pouvez écrire des vérifications à faire ceci ou à obtenir autour de lui d'une autre manière, mais ce n'est pas une fonctionnalité intégrée (on en vient à des questions complexes d'indexation, vraiment, et personne n'a rédigé les bits nécessaires pour assurer automatique). Au lieu d'utiliser l'héritage de table pour cet effet, souvent une meilleure correspondance dans la base de données pour l'objet de l'héritage est de faire des extensions de schéma de tables. Quelque chose comme ceci:
Maintenant, nous avons une représentation canonique de référence pour l'instance de l'animal que l'on peut utiliser fiable comme une référence de clé étrangère, et nous avons un "ilk" colonne qui fait référence à une table de xxx_ilk définitions qui pointe à la "prochaine" table de données étendu (ou indique qu'il n'y est aucune si l'image est de type générique lui-même). L'écriture de fonctions de table, vue, etc. face à ce type de schéma est tellement facile que la plupart des frameworks ORM faire exactement ce genre de chose en arrière-plan lorsque vous avez recours à de la programmation orientée objet-classe de style héritage de créer des familles de types d'objet.
mammal JOIN human
, juste parce que l'écriture d'un rejoindre à chaque fois que c'est ennuyeux. Mais ne pas éviter les jointures. Les jointures sont ce qui met le R dans les SGBDR. Si vous n'aimez pas les jointures, vous devriez utiliser une autre db type.Héritage peut être utilisé dans un paradigme de la programmation orientée objet tant que vous n'avez pas besoin de créer les clés étrangères de la table parent. Par exemple, si vous avez une classe abstraite véhicule stocké dans un véhicule de table et une table de voiture qui en hérite, toutes les voitures seront visibles dans le véhicule de la table, mais une clé étrangère d'un pilote de table sur le véhicule, le tableau ne correspond pas les thèses de dossiers.
Héritage peut également être utilisé comme un partitionnement outil. Ceci est particulièrement utile lorsque vous avez des tables destinées à être de plus en plus pour toujours (tableaux de bord, etc).
Principale utilisation de l'héritage est pour le partitionnement, mais il est parfois utile dans d'autres situations. Dans ma base de données il y a plusieurs tables ne différant que par une clé étrangère. Ma "classe abstraite" de la table "image" contient un "ID" (clé primaire pour cela, il faut dans chaque tableau) et PostGIS 2.0 raster. Héritée des tableaux tels que "site_map" ou "artifact_drawing" ont une colonne de clé étrangère ("nom_site" colonne de texte pour "site_map", "artifact_id" colonne de type integer pour le "artifact_drawing" table, etc.) et primaire et les contraintes de clé étrangère; le reste est hérité de celui de l ' "image" de la table. Je pense que je pourrais avoir à ajouter une "description" de la colonne de toutes les tables de l'image dans l'avenir, donc cela peut me sauver beaucoup de travail sans faire de réels problèmes (ainsi, la base de données peut s'exécuter peu plus lent).
EDIT: une autre bonne utilisation: avec deux tables de manipulation des utilisateurs non enregistrés, d'autres Sgbdr ont des problèmes avec la manipulation des deux tables, mais dans PostgreSQL, il est facile - il suffit d'ajouter
ONLY
lorsque vous n'êtes pas intéressé (e) par les données dans le héritée "utilisateur non enregistré" de la table.La seule expérience que j'ai hérités de tables, est en partioning. Il fonctionne très bien mais c'est pas le plus sophistiqué et facile à utiliser une partie de PostgreSQL.
La semaine dernière nous étions à la recherche de la même OOP problème, mais nous avons eu trop de problèmes avec la mise en veille prolongée (n'a pas, comme notre programme d'installation), nous n'avons donc pas utiliser l'héritage dans PostgreSQL.
Je utiliser l'héritage, quand j'ai plus que 1 sur 1 les relations entre les tables.
Exemple: supposons que vous souhaitez stocker objet de certains points de la carte avec des attributs x, y, rotation, échelle.
Maintenant, supposons que vous avez plusieurs différents types d'objets à afficher sur la carte et chaque objet a sa propre carte de localisation des paramètres, paramètres de la carte ne sont jamais réutilisés.
Dans ces cas, l'héritage de table serait très utile pour éviter d'avoir à maintenir unnormalised tables ou d'avoir à créer emplacement id et renvois à d'autres tables.
Les utiliser aussi peu que possible. Et cela signifie généralement jamais, il ébullition bas sur un moyen de créer des structures qui violent le modèle relationnel, par exemple par la rupture du principe d'information des citoyens et en créant des sacs au lieu de les relations.
Au lieu de cela, utilisez la table de partitionnement combiné avec un bon relationnel modélisation, y compris les nouvelles formes normales.