2009-09-28 5 views
1

Je dois stocker des paires clé-valeur dans une base de données, où la clé est, par ex. une chaîne, et la valeur peut être de plusieurs types (entier, chaîne, flottant/date, GUID, BLOB). La base de données est accessible via OLE DB, je veux donc coller aux types "normaux". Ces clés peuvent être impliquées dans des requêtes "exists", les valeurs ne sont pas impliquées dans les requêtes (c'est-à-dire que je ne demanderai pas "toutes les clés dont la valeur est 17"). Des paires valeur/clé supplémentaires seront ajoutées ultérieurement.Stockage de divers types de valeur dans une base de données

Je vois actuellement les options suivantes:

1. blob sérialisé
Sérialisation la valeur-clé-ensemble (cette fonctionnalité est déjà disponible) et le stocker en tant que blob unique.

Le seul problème que j'ai avec cela est que les valeurs individuelles ne peuvent pas être mises à jour facilement lorsque la base de données est partagée. C'est actuellement un problème (l'ensemble actuel de valeurs n'est mis à jour que lorsque le DB est ouvert exclusivement) mais cela semble être une limitation pour l'accès futur.

2.-BLOB Key
rang consisterait à Key, Type, BLOB stocker les données brutes. fait pour une conversion et des tests laids, mais permettrait d'étendre les types de var plus tard facilement. Je ne sais pas à quel point les frais généraux est pour blob storign de, mais le nombre d'éléments est faible (environ une douzaine.

3. Une colonne pour chaque type de valeur
rang consisterait Key, Type, int, double, sting, blob, le type indiquerait quelle colonne est utilisée. on dirait horrible à moi, mais aussi moins « abusive ».

4. une colonne par réglage
(en utilisant une seule ligne). Je ne considère pas vraiment.

Idées? Commentaires? Autre a pproaches?

+0

Comment votre application sait-elle quel type est la valeur lors de l'enregistrement et du chargement? Le sait-il avant de demander la valeur, c'est-à-dire qu'il sait à l'avance que seule une valeur int aurait du sens? Cela conduit certains des choix. – Mark

+0

Oui, il le sait à l'avance. Fondamentalement, il est défini (implicitement) par la clé, par ex. la clé 'DBDefaultNodeID' serait toujours un' GUID'. Cependant, les clés inconnues ne doivent pas être affectées. – peterchen

Répondre

3

Une autre option consisterait à utiliser une table par type. Utilisez une vue pour rendre toutes les touches visibles en même temps. Ici, vous pouvez ajouter une colonne qui vous indique le type de la valeur afin que vous puissiez l'extraire aussi.

create view KEY_TABLES as 
select key, 'INT_TABLE' from INT_TABLE 
union 
select key, 'STRING_TABLE' from STRING_TABLE 
... 
+0

Cela semble un peu trop complexe pour la quantité de données que je regarde en ce moment, mais une idée intéressante dans tous les cas. Je vais au moins essayer si cela fonctionne via les fournisseurs OLE DB que nous utilisons. – peterchen

+0

Étant donné que vous connaissez les types de données avant de ne pas avoir besoin de la vue globale uniquement les tables sous-jacentes. – Mark

Questions connexes