9
votes

Héritage des entités de données de base -> Limitations?

Je pensais que je posterai ceci à la communauté. J'utilise Coredata et j'ai deux entités. Les deux entités ont une relation hiérarchique. Je remarque pas beaucoup de fonctionnalités dupliquées maintenant et je me demandais si je devrais ré-structurer pour avoir une entité de base qui est abstraite (hiérarchiqueObject) et que mes entités héritent d'eux.

La question est-elle si la question est là quelques limitations de ce héritage que je devrais prendre en compte? Lecture des postes là-bas, je vois quelques compromis, laissez-moi savoir si mes hypothèses sont correctes.

  1. (bon) Structure de nettoyage, gardez la fonctionnalité hiérarchiqueObject à un endroit.
  2. (OK) avec héritage, les deux objets se retrouvent maintenant dans la même table SQLite (j'utilise SQLite comme backend). Donc, si le nombre d'objets grandir, la recherche / tri pourrait prendre plus de temps? Je ne sais pas si c'est une affaire énorme, car le nombre d'objets dans mon cas devrait rester jolie statique.
  3. (pas si bon) avec héritage, la relation pourrait être plus compliquée? ( http://www.cocoadev.com/index.pl?coredAnHeritanceSues )

    Y a-t-il d'autres choses à prendre en compte?

    Merci pour vos commentaires.


0 commentaires

3 Réponses :


2
votes

J'ai eu des problèmes dans le passé avec la migration de données de modèles qui avaient hérité - vous voudrez peut-être expérimenter avec cela et voir si vous pouvez le faire fonctionner.

Comme vous l'avez noté aussi, tous les objets vont dans une table.

Toutefois, comme les données principales gèlent un graphique d'objet, il est vraiment agréable de garder la structure comme vous le feriez naturellement de modéliser les objets - ce qui inclut l'héritage. Il y a beaucoup à dire pour garder le modèle sain d'esprit afin que vous fassiez moins de travail dans le maintien du code.

J'ai utilisé personnellement un modèle de CD assez complexe avec héritage dans l'une de mes propres applications, et elle a fonctionné correctement (en dehors de, comme je l'ai dit avoir des problèmes avec la migration de données, mais cela a été aussi facile pour moi en général I Ne comptez plus sur cela qui fonctionne plus).


0 commentaires

16
votes

Je pense que c'est une erreur de dessiner pour fermer un parallèle entre entités et classes. Bien que très similaires, ils ont des différences importantes.

La différence la plus importante est que les entités n'ont pas de code comme une classe le feraient donc lorsque vous avez des entités avec des attributs en double, vous n'ayez pas ajouté beaucoup de codage supplémentaire et potentiel d'introduction de bugs.

Beaucoup de gens croient que l'héritage de classe doit être parallèle au héritage de l'entité. Ce ne est pas. Tant que une classe descend de NsmaniedObject et répond aux messages de la valeur de la clé de l'entité qui représente, la classe peut avoir de nombreuses aventures joyeuses dans son héritage qui ne sont pas reflétées dans l'héritage des entités. Par exemple. Il est assez courant de créer une classe de base personnalisée juste en dessous de NsManèdeObject et de toutes les sous-classes d'objet gérées ultérieures héritées de ce que quelles que soient leurs entités.

Je pense que la seule fois que l'héritage de l'entité est absolument nécessaire, c'est quand vous besoin d'entités différentes à apparaître dans la même relation. E.g: xxx

maintenant le propriétaire.veHical peut contenir un objet objet ou un objet voiture . Notez que l'héritage de la classe d'objet gérée pour Motocycle et voiture ne doit pas être identique. Vous pourriez avoir quelque chose comme Motocycle: Twowheheeled: NsmanagedObject et Voiture: Awheheheeled: NsmanagedObject et tout fonctionnerait bien.

À la fin, les entités ne sont que des instructions sur le contexte pour le dire comment le graphique d'objet s'intègre ensemble. Tant que votre disposition de votre entité fait que cela se produise, vous avez une grande flexibilité dans les détails de la conception, un peu plus que vous n'auriez dans une situation analogue avec des classes.


1 commentaires

Merci pour l'explication détaillée! Dans mon cas, ce ne sont pas vraiment des entités liées, plus pour le code "nettoyage" et de garder le modèle sain d'esprit. Mais compte tenu de vos commentaires, et que Kendall, je vais juste le laisser tel qu'il est. Pas une énorme quantité de code, et ne veut pas vraiment faire face aux côtés potentiels. Merci encore!



9
votes

Je pensais qu'il serait utile de mentionner que l'application Notes sur iOS 10 utilise l'héritage dans son modèle de données de base. Ils utilisent une synchronisation d'entité de base, qui comporte 7 sous-entités, notamment la note et le dossier. Et comme vous avez mentionné toutes ces personnes sont stockées dans la même table SQLite qui comporte des colonnes à 106 colonnes, et car elles sont partagées entre toutes les entités, la plupart sont NULL. Ils ont également mis en place le dossier-notes sur une relation à une autre en tant que plusieurs à plusieurs, ce qui crée une table de pivotement, ce qui pourrait être un travail autour d'un problème de succession.

Il y a quelques avantages à utiliser l'héritage de l'entité qui l'emportent probablement sur ces limitations de stockage. Par exemple, une contrainte unique peut être unique entre les entités. Et une demande de récupération peut renvoyer différentes entités faisant une interface utilisateur qui utilise un contrôleur de résultats récupéré plus simple, par ex. regroupement par comptes ou dossiers dans une barre latérale.


1 commentaires

Avez-vous une source à ce sujet? J'aimerais en savoir plus à ce sujet