2011-03-04 6 views
1

J'ai besoin d'extraire des données d'un message entrant qui pourrait être dans n'importe quel format. Les données extraites à stocker dépendent également du format, ie le format A pourrait extraire le champ X, Y, Z, mais le format B pourrait extraire le champ A, B, C. J'ai aussi besoin de voir le message B en cherchant le champ C dans le message.Que utiliser pour stocker les données sérialisées pouvant être interrogées?

Actuellement, je configure et stocke une stratégie d'extraction (XSLT) et l'exécute à l'exécution lorsque son format associé est rencontré, mais je stocke les données extraites dans une base de données Oracle en tant que colonne XmlType. Oracle semble avoir un développement/support assez lâche pour XmlType car il nécessite un vieux jar qui vous oblige à utiliser un vieux DOM DocumentBuilderFactory impl (ressemble à du code Java 1.4), qui entre en collision avec Spring 3, et ne joue pas très bien avec Hiberner. Les requêtes XML sont lentes et non intuitives.

Je conclus qu'Oracle avec XmlType n'est pas un très bon moyen de stocker les données extraites, alors ma question est, quelle est la meilleure façon de stocker les données sérialisées/interrogeables?

Répondre

2

Une variante que vous n'avez pas répertoriée utilise un XML Database. (Notez qu'Oracle est l'un des dix produits de base de données XML.)

(De toute évidence, un type blob ne permet pas d'interroger "à l'intérieur" les objets XML persistants sauf si vous lisez chaque instance de blob en mémoire et effectuez l'interrogation là, par exemple en utilisant XSLT.)

+0

sons intéressants. BaseX semble très prometteur. Merci pour le conseil! – hisdrewness

+0

"merci pour le conseil" devrait convertir en un upvote ;-) Ne vous inquiétez pas, je l'ai fait pour vous. –

+0

Merci Joachim. Il devrait y avoir un badge pour upvoter une réponse au nom de quelqu'un d'autre :-). –

1

J'ai eu beaucoup de succès dans le stockage d'objets XML complexes dans PostgreSQL. Avec les fonctions d'index fonctionnelles, vous pouvez même créer des index sur les valeurs de nœud des fichiers xml stockés et utiliser ces index pour effectuer des recherches très rapides à l'aide d'analyses d'index sans avoir à réorganiser le fichier XML. Cela fonctionnera cependant seulement si vous connaissez vos modèles de requête, les requêtes xpath arbitraires seront également lentes.

Exemple (non testé, contient des erreurs de syntaxe pour vous):

Créer une table simple:

create table test123 (
    int serial primary key, 
    myxml text 
) 

permet maintenant supposer que vous avez des documents XML comme:

<test> 
    <name>Peter</name> 
    <info>Peter is a <i>very</i> good cook</info> 
</test> 

Maintenant, créez un indice de fonction:

create index idx_test123_name on table123 using xpath(xml,"/test/name"); 

FAISONS Maintenant vous xml rapide lookups:

SELECT xml FROM test123 WHERE xpath(xml,"/test/name") = 'Peter'; 

Vous devriez également envisager de créer un index à l'aide text_pattern_ops, vous pouvez donc avoir de préfixe rapide lookups comme:

SELECT xml FROM test123 WHERE xpath(xml,"/test/name") like 'Pe%'; 
Questions connexes