La meilleure façon d'utiliser une base de données PostgreSQL comme un magasin de valeur simple clé

StackOverflow https://stackoverflow.com/questions/2008439

Question

Je suis d'être obligé d'utiliser une base de données et postgreSQL il remplacera mon utilisation actuelle de BerkeleyDB. Bien que; Je sais que ce n'est pas une situation idéale, il est hors de mon contrôle.

La question est donc ... Si vous deviez faire postgreSQL dans un magasin de valeur clé comment feriez-vous à faire cela, tout en le rendant plus efficace possible?

Mes valeurs sont des tableaux d'octets et mes clés de l'sont des chaînes, je pourrais imposer certaines restrictions sur les longueurs de ces chaînes.

Je suppose que je devrais utiliser un blob pour ma valeur et la colonne de clé primaire maintenant enfoncée la touche, mais comme je me permets juste dans ce voyage, je suis curieux de savoir si quelqu'un dans la communauté de débordement de pile a fait cela, ou s'il y a des spécifiques « gotchas » je devrais regarder pour.

Était-ce utile?

La solution

L'extension de Postgresql à faire correctement ce qu'on appelle hstore. Il fonctionne de la même façon que vous attendez d'autres systèmes de stockage clé-valeur. Il suffit de charger l'extension. La syntaxe est unique, mais si vous avez déjà utilisé ou Redis mongo vous obtiendrez rapidement. Ne pas rendre plus difficile qu'elle ne l'est. Je comprends, nous ne sont pas souvent choisir nos outils et doivent faire avec.
Voici la page du document:

http://www.postgresql.org/docs/9.1/static/ hstore.html

Autres conseils

Si vous êtes obligé d'utiliser la base de données relationnelle, je vous suggère d'essayer de trouver la structure de vos données pour tirer profit du fait, puisque vous renoncez à l'avantage de la vitesse que vous avez obtenu des données non structurées et stocker la valeur clé. Plus structure que vous trouverez le meilleur avantage que vous sortez de votre situation. Même si vous trouvez que la structure dans les clés.

Voir également si vous aurez seulement besoin d'un accès séquentiel ou aléatoire à vos données et dans lequel le rapport et la structure de votre base de données par cette exigence. Est-ce que vous allez faire des requêtes sur vos valeurs par type, par exemple? Chacune de ces questions pourrait avoir un effet sur la façon dont vous structurez votre base de données.

Une considération particulière sur les blobs dans postgresql ils sont représentés en interne comme pg_largetable (loid: oid, pageno: int4, données: bytea). La taille des morceaux est définie par LOBBLKSIZE, mais généralement 2k. Donc, si vous pouvez utiliser des tableaux d'octets dans votre table au lieu de blobs et la taille limite de votre valeur / paire de clés sous blocksize, vous pouvez éviter ce indirection par seconde table. Vous pouvez également augmenter la taille du bloc si vous avez accès à la configuration de la base de données.

Je vous suggère d'aller chercher de la structure des données et des modèles dans l'accès aux données, puis posez votre question à nouveau avec plus de détails.

Il devrait vraiment dépendre de ce que la clé sera. Si ce sera toujours une chaîne en 255 caractères, utilisez VARCHAR comme yoru PK, puis utiliser un blob (en supposant une grande valeur) pour la valeur. si elle sera toujours un certain nombre, utilisation int, etc.

En d'autres termes, ont besoin de plus d'informations pour vous donner vraiment une bonne réponse:)

Qu'est-ce que vous devez stocker une valeur? Cordes? Ints? Les objets (par exemple des objets Java sérialisés). Une simple mise en œuvre travaillerait avec une table 3 colonnes ressemblant à:

NAME(VARCHAR)   TYPE(VARCHAR)   VALUE(VARCHAR)

(peut-être le type est une énumération). Ce qui précède ne fonctionnerait pas pour les données binaires comme des objets sérialisés, bien et peut-être vous avez besoin d'un blob là.

Sinon (et probablement beaucoup meilleure idée), vous avez vu Apache Commons de configuration? Vous pouvez sauvegarder que une base de données (via JDBC) et vous pouvez stocker des propriétés telles que vous les récupérer ainsi:

// get a property called 'number'
Double double = config.getDouble("number");
Integer integer = config.getInteger("number");

Cela peut vous faire économiser beaucoup de chagrin en termes de mise en œuvre. Vous peut avoir un problème avec l'enregistrement des données binaires dans la mesure où vous auriez à serialise il avant l'insertion et après la récupération. Mais je l'ai utilisé dans le passé pour le stockage ints, doubles et objets Java sérialisés via Xstream, donc je peux confirmer qu'il fonctionne bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top