La meilleure façon de stocker des données dans la base de données lorsque vous ne connaissez pas le type

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

Question

J'ai une table dans ma base de données qui représente sous une forme des zones de données personnalisée. Le DataField donne une représentation de ce type de contrôle, il doit être représenté avec, et quel type de valeur qu'elle devrait prendre. Simplifié, vous pouvez dire que j'ai 2 entités dans ce tableau - Textbox prendre une corde et ne prenant Textbox chiffres.

Maintenant, j'ai les différentes valeurs stockées dans une table séparée, faisant référence à la définition dataField. Quelle est la meilleure façon de conserver la valeur de données ici, quand le type est différent?

Une solution possible est d'avoir la table FieldValue cale un champ par type de valeur possible. Maintenant, ce serait certainement redondant, mais au moins j'obtenir la valeur stockée dans sa forme correcte - simplifier les requêtes plus tard.

FieldValue
----------
Id
DataFieldId
IntValue
DoubleValue
BoolValue
DataValue
..

Une autre possibilité est de stocker tout simplement sous forme de chaîne, et ce casting dans les requêtes. J'utilise .Net avec NHibernate, et je vois qu'au moins ici, il y a un Projections.Cast qui peut être utilisé pour couler par exemple chaîne à int dans la requête.

De toute façon dans ces deux solutions dont j'ai besoin de savoir quel type à utiliser lors de faire la requête, mais je sais que le DataField, de sorte que ce ne sera pas un problème.

Quoi qu'il en soit; Je ne pense pas que l'une de ces solutions de bons sons. Sont-ils? Ou est-il un moyen de mieux?

Était-ce utile?

La solution

Il n'y a pas 3 option « magique »:. Votre situation spécifique détermine la façon dont vous voulez procéder

D'après mon expérience, une solution de chaîne seule logique avec des choses comme les paramètres d'application. D'habitude, je ne ai pas besoin d'utiliser ces données dans les requêtes directement si ça ne me dérange pas beaucoup que c'est sous forme de chaîne.

Je ne suis pas sûr, mais il semble être le cas que vous étendez une entité avec des attributs personnalisés, qui sonne comme vous pouvez faire un peu de traitement dans la base de données à un moment donné. Dans ce cas, vous pouvez aussi bien aller à l'approche de plusieurs colonnes et ne remplir que la colonne avec le bon type. Il ne va pas être assez, mais il pourrait simplifier les requêtes.

Comme je l'ai dit, cela dépend si et quel genre de questions que vous devez exécuter, ce genre de performance dont vous avez besoin, etc.

Autres conseils

Tirer l'idée du stockage de données multi-locataires, vous pouvez utiliser le Les valeurs « Nom paires » idée comme décrit sur MSDN . Je pense en quelque sorte que cet article sera plus utile en dehors de la section spécifique noté.

En effet, pour en faire une solution évolutive, vous devez définir les types de données pour votre formulaire personnalisé à l'aide d'une table de méta-données dans laquelle vous définissez le type réel des données que vous souhaitez stocker (par exemple bool, texte, int , datetime). Vous pouvez également envisager de stocker le type .Net ainsi, car cela pourrait être en mesure de vous aider en matière de validation d'entrée, etc. D'autres détails qui peuvent aussi être stockés sont le nom des champs que vous les attendez à apparaître sur votre formulaire personnalisé. En utilisant cette approche vous construisez une forme personnalisée basée sur les métadonnées stockées.

J'ai utilisé avec succès cette approche et il fonctionne très bien. En complément, nous avons également utilisé le tableau des métadonnées pour déterminer si la valeur attendue pour le champ personnalisé est fourni par l'utilisateur (par exemple le nom, la date de naissance) ou une valeur de système prédéfini dans goutte-déclasser (par exemple, une liste des citye, pays ). À cette fin, nous avons une table supplémentaire, qui contient des options pour la liste qui est liée retour à la table des métadonnées.

Si vous avez seulement 2 zones de texte que l'utilisateur peut entrer des valeurs dans, et ce sera une chaîne ou un numéro, avez-vous vraiment besoin d'être en mesure de faire la distinction entre int et double, ne pouvez-vous stocker juste tout comme un type numérique approprié (en fonction de la DB). Cela vous Descendons à seulement 2 différents types et une solution possible serait d'avoir 2 tables, une pour chacun des deux types.

En général si, chaque fois que je vois qu'il est difficile de savoir ce que quelque chose va datatype être je commencerais inquiétant que le projet tente de devenir à générique qui a tendance à devenir assez salissante.

Avant d'offrir mon avis .. Je dirais que vous devrez peut-être revenir à la carte ER. Je suppose que CustomForm a beaucoup Les champs et que ces Les champs sont de différents types (textes, données, peut-être même comportement et le style), plutôt que généralisant le concept le champ il pourrait être utile au lieu d'envisager la création d'une table pour chaque type de champ. Par exemple. DateField, Nom d'utilisateuren, etc. Cela rendra le type de valeur soit exactement une colonne non nulle avec le bon type. Je serais prêt à parier aussi cela simplifierait votre code (moins les conditions pour vérifier, le db vous donne toutes les informations.)

Cela dit, vous ne pouvez pas être en mesure de revenir au conseil d'ER ou il peut y avoir sous-jacentes des raisons valables pour faire l'approche multiple-colonnes par type. Voici quelques avantages et les inconvénients d'une telle approche.

Plus

  • tous dans une table, peut se révéler plus rapide (rappelez-vous que la racine de tout le mal est ..)

Contre

  • DB ne peut appliquer que pas plus d'une valeur est spécifiée (code supplémentaire pour vérifier les exceptions)
  • DB ne peut appliquer au moins un est NULL (code supplémentaire pour vérifier FieldValues ??sans valeur)
  • Ajout du support d'un nouveau type de données nécessite un changement toutes les données existantes (en ajoutant une valeur NULL sur des colonnes).

Si vous êtes coincé avec CustomForm > Le champ -> FieldValue Je suggère la création d'une table par FieldValue . par exemple.

IntFieldValue
-------------
Id
DataFieldId
Value

DecimalFieldValue
-------------
Id
DataFieldId
Decimal


DateFieldValue
-------------
Id
DataFieldId
Date

Avec ce qui précède, vous pouvez toujours créer une vue qui sélectionne des tableaux ci-dessus. La vue peut être créé pour offrir une colonne par type de valeur et garantie et un seul d'entre eux n'est pas NULL. Ceci est également plus facile d'étendre (ajouter une nouvelle table, changer la vue, mais il ne nécessite pas la mise à jour des données existantes avec des valeurs nulles pour la nouvelle colonne de type).

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