2009-07-18 6 views
0

J'ai un certain type d'objet qui est stocké dans une base de données. Ce type obtient maintenant des informations supplémentaires associées qui différeront dans la structure entre les instances. Bien que l'information soit structurée de la même façon pour les groupes d'instances, la structure ne sera connue qu'à l'exécution et changera au fil du temps.Quel format de sérialisation pour les paires clé/valeur est le mieux indexable dans SGBDR?

J'ai décidé d'ajouter simplement un champ BLOB à la table et de stocker les paires clé/valeur dans un format sérialisé. D'après votre expérience, quel format est le plus conseillé?

Dans le contexte de mon application, l'espace de stockage est secondaire. Il y a une opération particulière que je veux être rapide, qui recherche l'instance correcte pour un ensemble donné de paires clé/valeur (donc c'est une sorte de clé composite à champ variable). Je suppose que cela signifie, existe-t-il un format qui joue particulièrement bien avec l'indexation de base de données typique?

En outre, je serais peut-être intéressé par la recherche d'un ensemble d'instances partageant le même jeu de clés (une «classe» adhoc, si vous le souhaitez). J'écris ceci en Java et je stocke dans divers types de bases de données SQL. JSON, GPB et la sérialisation Java native sont sur mon radar, favorisant les formats inter-langues. Je peux penser à deux stratégies de base:

  • stocker l'ensemble des valeurs du tableau et ajouter une clé étrangère à une table séparée qui contient l'ensemble des clés
  • magasin les paires clé/valeur dans le tableau

Répondre

1

Si votre objectif est de tirer parti des index de base de données, le stockage des données non structurées dans un BLOB ne sera pas efficace. Les BLOB sont essentiellement opaques du point de vue du SGBDR.

Je déduis de votre description que la partie non structurée des données prend la forme d'un ensemble arbitraire de paires valeur/clé associées à l'objet, n'est-ce pas? Eh bien, si les types de toutes les clés sont les mêmes (par exemple, toutes les chaînes), je vous recommande de créer simplement une table enfant avec (au moins) trois colonnes: la clé, la valeur et une clé étrangère au parent rangée de l'objet dans sa table. Puisque les clés seront alors stockées dans la base de données comme une colonne régulière, elles peuvent être indexées efficacement. L'index doit également inclure la clé étrangère à la table parent.

Une approche complètement différente serait de regarder un moteur de base de données "schemaless" comme CouchDB, qui est spécifiquement conçu pour traiter des données non structurées. Je n'ai aucune expérience avec de tels systèmes et je ne sais pas si le reste de votre application se prêterait bien à cette stratégie de stockage alternative, mais cela pourrait valoir la peine d'être examiné.

+0

Si vous décidez de prendre l'approche schemaless, Amazon.com SimpleDB est quelque chose d'autre que vous pouvez regarder - http://aws.amazon.com/simpledb/ –

+0

Certaines parties de mes données sont déjà schemaless, je sérialiser certains objets et stocker eux dans une table générique, tout comme FriendFeed fait (voir http://bret.appspot.com/entry/how-friendfeed-uses-mysql). Je fais ceci où je n'ai pas besoin des fonctionnalités RDBM et un schéma strict rendrait les choses plus difficiles, mais certaines parties de mes données sont parfaitement adaptées à un RDBM standard. Depuis que j'utilise cette stratégie hybride, je ne veux pas passer à CouchDB etc. –

+0

Merci pour vos commentaires sur la table de valeur-clé.J'avais déjà décidé contre cette approche, mais après avoir lu votre message, j'ai reconsidéré et il semble que je change d'avis. –

1

Pas vraiment une réponse à votre question, mais avez-vous envisagé de regarder le Java Edition of BerkeleyDB? Des clés dupliquées et des valeurs sérialisées peuvent être stockées avec ce moteur (rapide).

+0

Merci, c'est un lien intéressant, même si je ne sais pas vraiment comment cela m'aiderait dans ma situation actuelle. –

Questions connexes