2010-01-05 10 views
8

Je dois utiliser une base de données postgreSQL et elle remplacera mon utilisation actuelle de berkeleyDB. Bien que; Je réalise que ce n'est pas une situation idéale, c'est hors de mon contrôle.Meilleure façon d'utiliser une base de données PostgreSQL comme simple magasin de valeurs de clés

Donc, la question est ... Si vous deviez faire de PostgreSQL un magasin de valeurs clés, comment le feriez-vous en le rendant aussi efficace que possible?

Mes valeurs sont des tableaux d'octets et mes clés sont des chaînes, je pourrais imposer certaines restrictions sur la longueur de ces chaînes. Je suppose que je devrais utiliser un blob pour ma valeur et la colonne de la clé primaire qui contient la clé, mais comme je me lance 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 en a Je dois me méfier des «getchas» spécifiques.

+0

Qu'est-ce que ces tableaux d'octets représentent en fait? Fichier contenu? Objets sérialisés? Autres? – BalusC

+0

Ils sont en fait des objets actionscript sérialisés envoyés à un serveur ... mais le code serveur ne sait pas ou ne se soucie pas de ce qui s'y trouve. Et oui, je suis d'accord c'est un peu absurde, d'utiliser une base de données relationnelle comme un magasin de valeur clé. Mais certains des avantages de l'utilisation de la base de données sont toujours maintenus, tels que le fichier efficace io, le cryptage, les restrictions d'accès des utilisateurs, etc ... Alors, est-ce vraiment fou? – dennisjtaylor

+0

Oui. http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/ –

Répondre

18

L'extension dans Postgresql pour le faire correctement s'appelle hstore. Cela fonctionne de la même manière que vous attendez d'autres systèmes de magasins à valeur-clé. Il suffit de charger l'extension. La syntaxe est unique mais si vous avez déjà utilisé redis ou mongo, vous l'obtiendrez rapidement. Ne le rends pas plus difficile que ça ne l'est. Je comprends, nous n'avons souvent pas à choisir nos outils et nous devons nous débrouiller.
Voici la page du document:

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

+3

Ceci est la bonne réponse ... – AlexCode

+1

Voici comment charger l'extension. Vous devrez être un administrateur de bases de données ou un superutilisateur. CREATE EXTENSION HSTORE; – Stradas

0

De quoi avez-vous besoin pour stocker en tant que valeur? Cordes? Ints? Objets (par exemple, objets Java sérialisés). Une simple mise en œuvre fonctionnerait 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 les objets sérialisés, et peut-être vous avez besoin d'un BLOB là.

Alternativement (et probablement un beaucoup mieux meilleure idée), avez-vous vu Apache Commons 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 de données binaires, en ce que vous auriez à le sérialiser avant l'insertion et la post-récupération. Mais je l'ai utilisé par le passé pour stocker des ints, des doubles et des objets Java sérialisés via XStream, donc je peux confirmer que cela fonctionne bien.

0

Cela devrait vraiment dépendre de ce que la clé sera. Si ce sera toujours une chaîne de moins de 255 caractères, alors utilisez un Varchar comme yoru PK et ensuite utilisez 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 :)

2

Si vous êtes obligé d'utiliser la base de données relationnelle, je suggère à essayez de trouver une structure dans vos données pour profiter du fait, puisque vous renoncez à l'avantage de la vitesse que vous avez obtenue avec des données non structurées et un magasin de valeurs-clés. Le plus de structure que vous trouvez, le meilleur avantage que vous obtenez de votre situation. Même si vous ne trouvez que la structure dans les clés.

Considérez également si vous aurez seulement besoin d'un accès séquentiel ou aléatoire à vos données et dans quel ratio et structurez votre base de données par cette exigence. Allez-vous 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 spécifique à propos des blobs dans postgresql, ils sont représentés en interne comme pg_largetable (loid: oid, pageno: int4, data: bytea). La taille des blocs 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 limiter la taille de votre paire valeur/clé sous blocksize, vous pouvez éviter cette indirection via la deuxième table. Vous pouvez également augmenter la taille du bloc si vous avez accès à la configuration de la base de données.

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