27 votes

Techniques d'héritage de base de données?

Quels sont les conseils/techniques lorsque vous avez besoin de persister classes avec héritage de base de données relationnelle qui ne prend pas en charge l'héritage?

Dire que j'ai cet exemple classique:

Person -> Employee -> Manager
                   -> Team lead
                   -> Developer
       -> Customer -> PrivilegedCustomer
                   -> EnterpriseCustomer

Quelles sont les techniques disponibles pour la conception de la base de données? Avantages et inconvénients de chacun?

p.s. J'ai cherché et trouvé plusieurs question concernant la base de données héritage, mais la plupart étaient sur la modification d'un moteur de base de données qui prend en charge en mode natif. Mais disons que je suis coincé avec SQL Server 2005... quelles sont mes options?

25voto

cliff.meyers Points 10394

Trois stratégies communes:

  1. Créer une table pour chaque classe dans la hiérarchie qui contiennent les propriétés définies pour chaque classe et une clé étrangère vers le haut-niveau de la super-classe de la table. Alors vous pourriez avoir un "véhicule" de la table avec d'autres tableaux comme "voiture" et "avion" qui ont une "vehicle_id" de la colonne. L'inconvénient ici est que vous devrez peut-être effectuer un grand nombre de jointures juste pour obtenir une classe de type.

  2. Créer une table pour chaque classe dans la hiérarchie qui contient toutes les propriétés. Celui-ci peut être délicat, car il n'est pas facile de gérer une commune de ID sur tous les tableaux, sauf si vous utilisez quelque chose comme une séquence. Une requête pour une super-classe de type obligerait les syndicats à l'encontre de tous les tableaux en question.

  3. Créer un tableau pour l'ensemble de la hiérarchie de classe. Ceci élimine les jointures et les syndicats, mais exige que toutes les colonnes de toutes les propriétés de la classe dans un tableau. Vous aurez probablement besoin de sortir de la plupart des colonnes nullable depuis certaines colonnes ne s'appliquent pas aux documents d'un type différent. Par exemple, le "véhicule" de la table peut contenir une colonne appelée "envergure" qui correspond à la "Avion" de type. Si vous faites cette colonne not NULL alors une instance de "Voiture", inséré dans la table nécessite une valeur pour "envergure", même si une valeur NULL pourrait faire plus de sens. Si vous laissez la colonne nullable vous pourriez être en mesure de contourner cela avec les contraintes de vérification, mais il pourrait devenir laid.

5voto

Ken Yao Points 1032

Le chapitre 8. La cartographie de l'héritage dans le lien suivant en a également discuté. http://nhforge.org/doc/nh/en/index.html#inheritance

C'est le document NHibernate.

5voto

jjm340 Points 106

Soyez prudent avec la base de données de l'héritage dans certaines situations, nous avons intégré dans notre application de notre stratégie d'audit et nous nous sommes retrouvés avec un goulot d'étranglement des performances/cauchemar.

Le problème est que la table de base que nous avons utilisée était insérez uniquement et en évolution rapide, de sorte que nous nous sommes retrouvés avec des blocages de tous sur la place. Nous sommes actuellement à la planification de briser ces à l'écart, dans leurs propres tableaux, parce que les maux de tête, d'avoir les mêmes colonnes dans 15 tables différentes par rapport à un rendement cauchemar est bien la peine. À cela s'ajoutait le fait que l'entité cadre n'a pas nécessairement l'héritage de la poignée de façon efficace (c'est un problème connu par Microsoft).

De toute façon, juste pensé que je vous ferais partager quelques connaissances depuis que nous avons été par le biais de la presse sur cette question.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X