10
votes

Quel est le meilleur: clés étrangères ou héritage de modèle?

J'ai ce scénario de cas d'utilisation: Il y a des endroits qui sont des terrains de jeux, des restaurants, des théâtres, des pubs. Le même endroit peut avoir des terrains de jeux, des restaurants, des théâtres, etc. Il y a quelques façons de la mettre en œuvre:

  1. Utilisez des clés étrangères XXX

  2. héritage multilité XXX

  3. Utilisez la classe abstraite XXX

  4. Utilisez des modèles proxy XXX

    Quels sont les avantages et les inconvénients d'utiliser chaque approche?


3 commentaires

Vous devez nous en dire plus sur ce que vous faites avec ces objets et classes avant de pouvoir vous aider.


Eh bien, si vous regardez dans cela, je voulais juste demander quelle méthode de mise en œuvre est préférée à quel endroit? C'est plus une question architecturale.


La question "architecturale" ne peut pas être répondue dans le résumé.


4 Réponses :


0
votes

Je voterais pour une classe abstraite si le domaine dicte qu'un place ne peut pas exister s'il n'existe pas au moins l'un des autres.

Mais si un place n'a pas besoin de quelque chose que vous auriez besoin de multiples héritage pour accueillir les placards (lots vacants)?

J'imagine que les pro et des con sont tournés autour de votre penchant des tables de base de données parasites. Comment l'orèse met-elle en œuvre ces solutions? Personnellement, je n'aime pas avoir beaucoup de tables de champs simples mais YMMV.


0 commentaires

0
votes

Je voterais pour le premier, car c'est le plus explicite. Et je ne vois aucune advacité d'autres méthodes.


0 commentaires

1
votes

Cela dépend entièrement de quel type de comportement dont vous avez besoin.

Avez-vous besoin d'effectuer les mêmes types d'opérations sur des endroits et des restaurants ou des terrains de jeux? Voulez-vous vérifier si vos services (restaurants, etc.) sont au même endroit? Est-il significatif de traiter deux endroits avec la même adresse que différent et leurs services associés différents?

Sans connaître les réponses à ces types de questions, il est impossible de dire quelle est la technique la plus appropriée, comme ce sont des techniques très différentes, et non en substituant généralement les uns des autres.

L'utilisation de l'héritage ne doit pas être dictée par une notion pré-conçue sur la taxonomie, car elle n'est pas là pour modéliser la taxonomie: il est là pour fournir un polymorphisme de la fonction (héritage des membres de données est principalement de faciliter cela).


0 commentaires

16
votes

Le premier est l'héritage des modèles essentiellement, car c'est ce que la mise en œuvre de Django de MTI utilise (sauf que c'est un oneoonefield au lieu d'un fournedget , Mais c'est simplement un fournedgey c'est unique).

Chaque fois que vous avez un est-un relation (c'est-à-dire un restaurant est un lieu), vous avez affaire à héritage, vous utilisez donc l'une des méthodologies de modèle de modèle de Django, c'est la voie à suivre. Chacun, cependant, a ses avantages et ses inconvénients:

Modèles abstraits

Les modèles abstraits sont utiles lorsque vous souhaitez simplement charger des champs et / ou des méthodes répétitifs. Ils sont mieux utilisés comme mixes, plus que de vrais "parents". Par exemple, tous ces modèles auront une adresse, créant ainsi un modèle d'adresse abstraite et d'avoir chaque hérité de ce qui pourrait être une chose utile. Mais, un restaurant n'est pas une adresse , en soi, il ne s'agit donc pas d'une vraie relation parent-enfant.

MTI (héritage multiple de table)

C'est celui qui s'apparente à votre premier choix ci-dessus. Ceci est très utile lorsque vous devez interagir avec les classes des parents et des enfants et que les enfants ont des domaines uniques de leurs propres (champs, non méthodes). Ainsi, un restaurant peut avoir une cuisine Cuisine , mais un lieu n'aurait pas besoin de cela. Cependant, ils ont tous les deux une adresse, donc restaurant hérite et se détache de place .

modèles proxy

Les modèles proxy sont comme des alias. Ils ne peuvent pas avoir leurs propres champs, ils ne reçoivent que les champs du parent. Cependant, ils peuvent avoir leurs propres méthodes. Celles-ci sont donc utiles lorsque vous devez différencier les types de la même chose. Par exemple, je pourrais créer des modèles proxy tels que Staffuser et normaliseur à partir de utilisateur . Il n'y a toujours qu'une seule table utilisateur, mais je peux maintenant ajouter des méthodes uniques à chacun, créez deux vues administratives différentes, etc.

Pour votre scénario, les modèles proxy n'ont pas beaucoup de sens. Les enfants sont intrinsèquement plus compliqués que le parent et il ne serait pas logique de stocker tous les champs tels que Cuisine pour Restaurant sur Place . < / p>

vous pourrait utiliser un modèle abstrait , mais vous perdez ensuite la possibilité de fonctionner réellement place seul. Lorsque vous souhaitez une clé étrangère à un "lieu" généralisé, vous devrez utiliser des clés étrangères génériques, à la place, de pouvoir choisir parmi les différents types de places, ce qui ajoute beaucoup de frais généraux, si ce n'est pas nécessaire.

Votre meilleur pari utilise un héritage normal: MTI. Vous pouvez ensuite créer une clé étrangère sur place et ajouter quelque chose qui est un enfant de Place .


3 commentaires

D'une manière ou d'une autre, j'ai toujours aimé vos réponses, cela ne faisant pas exception. Merci!!


Hah, moi aussi! D'une manière ou d'une autre, je pense que Chris sait en fait ce qu'il fait.


Wow, j'aime cette réponse. J'ai peut-être une question connexe que vous pourriez peut-être répondre ici