Question

Je crée une application de saisie de données où les utilisateurs sont autorisés à créer le schéma d'entrée.

Ma première version de cette vient de créer une seule table par schéma d'entrée à chaque entrée couvrant une ou plusieurs colonnes (pour les types complexes) avec le type de données approprié. Cela a permis « rapide » interrogation (sur les petits ensembles de données que je ne l'ai pas index toutes les colonnes) et la synchronisation simple où les données d'entrée a été distribué sur plusieurs bases de données.

Je ne suis pas tout à fait satisfait de cette solution si; la seule chose positive est la simplicité ... Je ne peux stocker un nombre fixe de colonnes. Je dois créer des index sur toutes les colonnes. Je dois recréer la table sur les changements de schéma.

Certains de mes critères de conception clés sont:

  • Très rapide pour les requêtes (en utilisant un langage simple requête spécifique de domaine)
  • Rédige ne doit pas être rapide
  • De nombreux utilisateurs simultanés
  • Schemas changera souvent
  • peut contenir plusieurs Schemas mille colonnes
  • Les données-entrées peuvent être distribuées et les besoins syncronization.
  • Préférable MySQL et SQLite -. Les bases de données comme DB2 et Oracle est hors de question
  • Utilisation .Net / Mono

J'ai pensé à deux conceptions possibles, mais aucun d'entre eux semble être un bon choix.

Solution 1:. Union comme la table contenant une colonne de type et une colonne nullable par type

On évite ainsi rejoint, mais definitly utiliser beaucoup d'espace.

Solution 2: magasin clé / valeur. Toutes les valeurs sont stockées sous forme de chaîne et converties en cas de besoin.

Utilisez également beaucoup d'espace, et bien sûr, je déteste avoir à convertir tout à chaîne.

Solution 3:. L'utilisation d'une valeur de base de données XML ou stocker sous forme xml

Sans aucune expérience, je pense que cela est assez lent (au moins pour le modèle relationnel moins qu'il y ait un très bon soutien XPath). Je voudrais également éviter une base de données XML que d'autres parties de l'application est mieux adaptée en tant que modèle relationnel et être en mesure de joindre les données utiles.

Je ne peux pas aider à penser que quelqu'un a résolu (certaines) déjà, mais je suis incapable de trouver quoi que ce soit. Pas tout à fait sûr de ce que pour rechercher soit ...

Je sais que la recherche sur le marché est en train de faire quelque chose comme ça pour leurs questionnaires, mais il y a quelques implémentations open source, et ceux que j'ai trouvé ne correspond pas tout à fait le projet de loi.

RRF a beaucoup de la logique je pense; types de colonnes primitives, de colonnes, de lignes, l'interrogation rapide et fusion. Dommage qu'il ne fonctionne pas contre une base de données .. Et bien sûr ... Je ne ai pas besoin 99% des fonctionnalités fournies, mais beaucoup de choses non inclus.

Je ne suis pas sûr que ce soit le bon endroit pour poser une telle question liée à la conception, mais j'espère que quelqu'un ici a quelques conseils, connaître tous les travaux existants, ou peut me pointer vers un meilleur endroit pour poser une telle question.

Merci à l'avance!

Était-ce utile?

La solution

Avez-vous déjà considéré comme la solution la plus triviale: avoir une table pour chacun de vos types de données et le stockage du schéma de votre ensemble de données dans la base de données ainsi. La solution la plus simple:

DATASET Table (Virtual "table")
ID - primary key
Name - Name for the dataset/table

COLUMNSCHEMA Table (specifies the columns for one "dataset")
DATASETID - int (reference to Dataset-table)
COLID - smallint (unique # of the column)
Name - varchar
DataType - ("varchar", "int", whatever)

Row Table 
DATASETID
ID - Unique id for the "row"

ColumnData Table (one for each datatype)
ROWID - int (reference to Row-table)
COLID - smallint
DATA - (varchar/int/whatever)

Pour interroger un ensemble de données (une table virtuelle), vous devez alors construire dynamiquement une instruction SQL en utilisant les informations de schéma dans le tableau COLUMNSCHEMA.

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