10
votes

Une alternative au modèle de données hiérarchique

Domaine problématique

Je travaille sur une application assez grosse, qui utilise un modèle de données hiérarchique. Il faut des images, extrait les caractéristiques des images et crée des objets d'analyse sur ceux-ci. Donc, le modèle de base est comme un objet- (1: N) -Image_features- (1: 1) -Image. Mais le même ensemble d'images peut être utilisé pour créer plusieurs objets d'analyse (avec différentes options).

Ensuite, un objet et une image peuvent avoir beaucoup d'autres objets connectés, comme l'objet d'analyse pouvant être affiné avec des données supplémentaires ou des conclusions complexes (solutions) peuvent être basées sur l'objet d'analyse et d'autres données.

solution actuelle

Ceci est un croquis de la solution. Les piles représentent des ensembles d'objets, les flèches représentent des pointeurs (c'est-à-dire des caractéristiques d'image sur leurs images, mais pas vice versa). Certaines parties: images, caractéristiques d'image, données supplémentaires, peuvent être incluses dans plusieurs objets d'analyse (car l'utilisateur souhaite effectuer une analyse sur différents ensembles d'objet, combinés différemment).

Solution actuelle Structure simplifiée

Les images, les fonctionnalités, les données supplémentaires et les objets d'analyse sont stockés dans le stockage global (objet de Dieu). Les solutions sont stockées des objets d'analyse à l'intérieur du moyen de composition (et contiennent des fonctions de solution à son tour).

Toutes les entités (images, caractéristiques d'image, objets d'analyse, solutions, données supplémentaires) sont des instances de classes correspondantes (comme IImage, ...). Presque toutes les pièces sont facultatives (c'est-à-dire que nous voudrions peut-être jeter les images après avoir une solution).

Solution actuelle inconortations

  1. La navigation sur cette structure est douloureuse, lorsque vous avez besoin de connexions comme la pointillé dans le croquis. Si vous devez afficher une image avec quelques fonctions de solutions sur le dessus, vous devez d'abord itération via des objets d'analyse pour trouver lesquels d'entre eux sont basés sur cette image, puis itérer à travers les solutions pour les afficher.
  2. Si pour résoudre 1. Vous choisissez de stocker explicitement des liaisons en pointillé (c'est-à-dire que la classe d'image aura des pointeurs sur des fonctionnalités de solution, qui sont liées à celle-ci), vous mettra beaucoup d'efforts à maintenir la cohérence de ces pointeurs et à mettre à jour constamment les liens quand quelque chose change.

    mon idée

    J'aimerais construire un modèle de données plus extensible (2) et flexible (1). La première idée était d'utiliser un modèle relationnel, de séparer des objets et de leurs relations. Et pourquoi ne pas utiliser de RDBMS ici - SQLite semble moi un moteur approprié pour moi. Donc, des relations complexes seront accessibles par simple (gauche) jointure sur la base de données: pseudocode " images joindre images_to_image_features joindre image_features joindre image_features_to_Objects joinks jointure jointure solutions jointure_features

    la question

    alors ma question principale est

    • utilise SGBDM une solution appropriée pour les problèmes que j'ai décrits, sinon cela ne vaut pas la peine et il existe de meilleurs moyens d'organiser des informations dans mon application?

      Si RDBMS est correct, j'apprécierais tout conseils sur l'utilisation des RDBMS et une approche relationnelle pour stocker les relations d'objets C ++.


9 commentaires

Salut Steed. Ce que vous demandez est une question vraiment difficile. Vous posez également de nombreuses questions, pas une. Que faites-vous référence à un modèle de données? Avez-vous l'intention d'utiliser le modèle de données sur le réseau, écrivez-le au fichier, en mémoire? Sans plus de détails et une question spécifique, les réponses deviennent encore plus difficiles


J'ouvre un fichier, crée une structure de données, utilisez-le, enregistrez-le dans un fichier. Par "modèle de données", je veux dire stocker des informations sur les objets du monde et les relations entre eux en mémoire. Je vais essayer de modifier la question à vous concentrer sur une seule question.


Si j'ai besoin d'améliorer la question plus loin (comment?), S'il vous plaît laissez-moi savoir.


Vous semblez combiner une description de ce que vous essayez de faire, une description d'une solution que vous proposez et une question sur la solution à utiliser. Celles-ci peuvent toutes être des parties utiles d'une bonne question, mais je pense que vous devez les séparer un peu plus et clarifier exactement ce que vous demandez.


J'essaie juste de comprendre la structure de votre solution actuelle. Lorsque vous dites une "structure comme une arbre", voulez-vous dire que cela se fait dans une seule classe? Ou est-ce une collection de classes connexes? "Les données sont dupliquées" => pourquoi donc? Pourquoi ne maintenez-vous pas de lien avec les données pertinentes plutôt que de le faire dupliquer? "Beaucoup de travail devrait être fait, si vous avez une feuille" => Cela signifie-t-il que plus de mise en œuvre fonctionne ou plus de temps pour courir? En gros, recherchez-vous une optimisation temporelle ou une solution plus sécurisable / facilitée?


@PermanentGuest, Tletnes, j'ai une fois de plus la question pour essayer de répondre à vos demandes.


@Steed: Cette question semble maintenant beaucoup mieux. J'essaierais de répondre en un ou deux jours, mais certainement maintenant, vous obtiendriez de bonnes réponses des autres.


Regardez ici aussi oodbms: en.wikipedia.org/wiki/Object_database


@wingman, merci. À première vue, la gigabase semble prometteuse.


4 Réponses :


3
votes

Juste basé sur le diagramme, je suggérerais qu'une solution SMDBMS fonctionnerait effectivement. Cela fait des années depuis que j'étais développeur sur une TDRS (appelé RDM, bien sûr!), Mais j'ai pu renouveler mes connaissances et gagner de très nombreuses perspectives de précieuses dans la structure de données et la mise en page très similaire à ce que vous décrivez en lisant le fabuleux Réservez "L'art de SQL" de Stephane Faroult. Son livre contribuera grandement à répondre à vos questions.

J'ai inclus un lien sur Amazon, pour assurer la précision: http://www.amazon.com/the-art-sql-stephane-faroult/dp/0596008945

Vous n'aurez pas mal en le lisant, même si cela ne résoudra pas pleinement votre problème, car l'auteur fait un si grand travail de rupture d'une relation de manière claire et présentant des solutions élégantes. Le livre n'est pas un manuel pour SQL, mais une analyse approfondie de la façon de penser des données et de la manière dont elle interdite. Vérifiez-le!

Utilisation d'un RDBM pour suivre les liens entre les données peut être un moyen efficace de stocker et de penser à l'analyse que vous recherchez et que les liens sont "doux" - c'est-à-dire qu'ils s'en vont lorsque les objets durs qu'ils sont liés. supprimé. Cela garantit l'intégrité des données; et MSSR Fauroult peut répondre à ce qu'il faut faire pour que cela reste vrai.


2 commentaires

Merci d'avoir répondu! Je vérifierai le livre dès que je l'obtiens. Pouvez-vous penser à des inconvénients ou de points difficiles de mise en œuvre de la SMDBMS SOUTON (non couvert par le livre)?


Je ne peux pas penser à des inconvénients spécifiques autres que les données sont stockées sur le disque à l'aide du moteur RDBMS et non entièrement contenus dans la mémoire - mais bien sûr qu'un avantage peut à la place. La partie la plus difficile consistera à établir correctement les relations et à les maintenir lorsque des données sont supprimées; Mais ces choses que le livre fait un bon travail décrivant.



1
votes

http://www.boost.org/ Doc / Libs / 1_51_0 / LIBS / MULTI_IDEX / DOC / INDEX.HTML

"Vous mettrez beaucoup d'efforts à maintenir la cohérence de ces pointeurs et mis à jour constamment les liens lorsque quelque chose change. "

Avec l'aide de Boost.MultiDex, vous pouvez créer presque tous les types d'index sur une "table". Je pense que le problème cité n'est pas si grave. La solution originale est donc gérable.


1 commentaires

Merci pour la réponse, mais je ne peux pas voir tout de suite comment je pourrais utiliser Multi_index pour mon problème. Pourriez-vous clarifier un peu, s'il vous plaît?



4
votes

Vous voudrez peut-être examiner les technologies Web sémantiques, telles que le RDF, les RDF et le hibou qui fournissent une voie alternative et extensible de modéliser le monde. Il existe des magasins triples open-source disponibles et certains des RDBM traditionnels ont également des capacités de Triple Store.

En particulier, jetez un coup d'œil au tutoriel de Manchester Universités Protege / Owl: http: // owl.cs.manchester.ac.uk/Tutorials/proteguewolbutorial/

Et si vous décidez que cette direction vaut la peine d'être examinée plus loin, je peux recommander "Web sémantique pour l'ontologue de travail"


1 commentaires

Le tutoriel de hibou est excitant! Merci pour la réponse. Cela prendra du temps pour moi de lire et de comprendre, ainsi que de la solution de ShipR. Peut-être que je devrais créer deux primes ..;)



1
votes

Je ne recommande pas les RDBMS en fonction de vos besoins pour un modèle extensible et flexible.

  1. Chaque fois que vous modifiez votre modèle de données, vous devrez modifier le schéma de DB et qui peut impliquer plus de travail que le changement de code.
  2. Tous les problèmes avec les requêtes de DB sont découverts uniquement au moment de l'exécution. Cela peut faire beaucoup de différence pour le coût de la maintenance.

    Je recommande vivement d'utiliser la programmation Standard C ++ OO avec STL.

    1. Vous pouvez utiliser l'encapsulation pour que tout changement de données soit effectué correctement, avec des mises à jour d'objets et d'index associés.
    2. Vous pouvez utiliser STL pour créer des index hautement efficaces sur les données
    3. Vous pouvez créer des façades pour vous permettre d'obtenir facilement les informations, plutôt que de devoir aller à plusieurs objets / collections. Ce sera un travail unique
    4. Vous pouvez effectuer des cas de test unitaires pour assurer l'exactitude (beaucoup moins compliquée par rapport aux tests d'unités avec des bases de données)
    5. Vous pouvez utiliser le polymorphisme pour construire différents types d'objets, différents types d'analyse, etc.

      Tous les points très basiques, mais je pense que vos efforts seraient mieux utilisés si vous améliorez la solution actuelle plutôt que de rechercher une solution à base de DB.


1 commentaires

J'ai effectivement fini par tout faire en C ++ sans DBS. Juste plus d'abstraction et de code plus générique. Merci pour votre réponse.