2012-02-03 7 views
2

Je veux créer un système dans lequel un administrateur peut créer des formulaires avec le programme et les utilisateurs entrent des données dans ces formulaires. En outre, les administrateurs devraient être en mesure d'entrer tous les noms de champs dans leurs formulaires, même les questions à choix multiples sélectionnables. Seule la réponse que je peux donner est de créer un énorme bloc de texte pour chaque type de formulaire généré et de stocker des champs de formulaire, des noms, des choix, etc. en les sérialisant à partir d'un tableau ou d'un objet. Je conserverais les réponses des utilisateurs dans des tableaux sérialisés dans un autre bloc de texte, en affectant chacun à leurs positions dans les tableaux.Meilleure façon de conserver les champs de base de données dynamiques?

Y a-t-il une meilleure approche pour ce problème?

+0

J'ai commencé à être ennuyé par ce truc au format Q & A standard idiot. Je suis désolé mais j'avais besoin de cette information de quelqu'un qui a au moins une certaine expérience sur ce genre de choses, et les gens m'ont aidé si vous pouviez faire défiler un peu. Il n'y avait pas de discussion inutile sur ce qui est mieux et d'autres sont nulles. En outre, cela pourrait être le point où l'un des répondeurs pourrait dire «ne faites pas cela avec la base de données, voici une meilleure façon». Et c'est important pour moi aussi. Je pense que ce nazi comme réponse fermeture est la raison S.O. va commencer à tomber. Ne cassez pas une grande communauté comme le soleil a fait – gkaykck

Répondre

4

Un EAV data model peut convenir à vos besoins ici. Sachez que vous paierez pour la flexibilité avec quelques inconvénients, tels que le manque d'intégrité référentielle et de longues requêtes pour récupérer des données (chaque attribut que vous voulez retourner nécessite un autre JOIN).

0

Pourriez-vous créer une table dans la base de données appelée quelque chose comme "Champs"? Chaque champ a un type et un texte. Ensuite, ayez également une table appelée options, qui contient un champ de texte différent pour les options, ainsi qu'un fk pointant vers la table "fields". Il pourrait également y avoir une table de formulaire à laquelle la table de champs a un fk. Dans le code de l'application, vous pouvez alors regarder un champ et déterminer si vous avez besoin d'aller chercher une option. C'est une approche de base de données relationnelle. Certaines bases de données d'objets comme Mongo peuvent gérer cela beaucoup mieux.

Pour résumer:

Tableau: Forme Colonne: form_id PK

Tableau: Champ Colonne: FIELD_ID PK Colonne: Texte Colonne: Type Colonne: form_id (FK)

Tableau: Options Colonne: ID_option Colonne: Texte Colonne: Field_ID (FK)

2

Il y a plusieurs façons de procéder. Puisque vous travaillez avec une base de données relationnelle, une option est de regarder le Entity-Attribute-Value model. En effet, cette approche bascule votre structure de données d'un schéma prédéfini (colonnes) en lignes. Il y a de nombreux inconvénients à cette flexibilité, et vous finissez souvent par construire un tas de vues pour présenter certaines de ces données "tournées" sous la forme d'une table plus traditionnelle. Certaines bases de données relationnelles fournissent des fonctionnalités de type noSQL. Vous pouvez donc trouver une solution dans cette direction. PostgreSQL, par exemple, a le type hstore, qui vous permet de stocker des ensembles de paires clé-valeur dans une seule valeur. Je me rends compte que vous n'avez pas mentionné PostgreSQL dans votre question, mais juste pour que vous sachiez ce qui est disponible, ils travaillent également sur un type de données JSON natif et une suite de fonctions pour 9.2. Combiné avec des index fonctionnels, ceci pourrait fournir des possibilités hybrides relationnelles/noSQL intéressantes sans quelque chose comme Redis ou MongoDB.

Questions connexes