2009-06-07 8 views
5

Je dois autoriser les utilisateurs à ajouter de nouveaux champs à un enregistrement, par ex. S'il y a un enregistrement Contact, un utilisateur peut vouloir ajouter un champ numérique "SSN" et un champ de date/calendrier "Birthdate". Ils le feraient à travers l'interface utilisateur, bien sûr.Comment créer et stocker des champs personnalisés définis par l'utilisateur dans une base de données SQL?

Ces champs devraient alors pouvoir être saisis pour tous les enregistrements de contact. Étant donné que mon application fonctionne pour de nombreux utilisateurs simultanément (pas un déploiement mono-entreprise, etc.) et théoriquement tout le monde pourrait ajouter ses propres champs personnalisés, quelle serait la meilleure pratique pour stocker cette information dans une base de données, surtout quand elle doit être consultable?

+1

Franchement, je vous pense » re demander des ennuis en demandant aux utilisateurs individuels leurs besoins à la volée. Par exemple, si vous avez 10 personnes qui ont besoin de la même information mais que vous la nomme de 10 manières différentes, vous allez avoir beaucoup de complexité pour très peu d'avantages. Il serait peut-être préférable de rencontrer les utilisateurs et de parvenir à un consensus plutôt que de faire des choses ad hoc. –

+0

Vous avez 100% raison. Je suis coincé avec cette exigence si :( – Alex

+0

J'ai accomplir cela dans de nombreuses applications, Lorsque vous implémentez ce type d'exigence, c'est très difficile, mais cela donnera plus de flexibilité à l'utilisateur pour ajouter des champs personnalisés –

Répondre

1

Nous ajoutons presque dans notre toutes les applications/produits attribut/support de champ supplémentaire pour la flexibilité donnée à l'utilisateur
Comme nous avons une catégorie de produits, dans la catégorie, le client peut définir l'attribut supplémentaire de tout produit
ce que nous faisons dans le niveau de base de données est:
Catégorie Table ont une colonne supplémentaire comme: Text1Att, Text2Att ... pour la prise en charge de la valeur de texte, Num1Att, Num2Att ... pour la prise en charge de la valeur numérique, Date1Att, Date2Att ... pour la prise en charge de la date et heure, ID1Att , ID2Att ... support pour l'ID de l'autre table comme vous pouvez ajouter dropdown, listbox, ...
ici toutes les colonnes ont le type de données String.
ce que nous stockons ici est

nous stockons les méta-informations ici, comme pour Text1Att méta est
SSN, zone de texte, 50, vrai, faux, nul;
Légende du champ; Type de contrôle; Longueur maximale; Champ obligatoire; validation personnalisée requise; Message de validation personnalisé
lieu de naissance; textbox; 100; true; true; Invalid Value;
même pour le champ numérique ...
pour ce jour les méta-informations ressemblera
date de naissance, le contrôle du calendrier, vrai, vrai, date non valide;
Légende du champ; Le contrôle du calendrier ou peut être autre, est requis, est la validation personnalisée; Message de validation personnalisé


Que faites dans le tableau des produits est d'ajouter même nombre de colonnes et ont datatype text1Att, .. est varchar, num1Att ont numérique, date1Att ont datetime, ID1Att ont int

Ce que nous faisons côté GUI est: D'autre part, lorsque nous définissons un produit dans une catégorie, les méta-informations sont lues et parcourues depuis la table des catégories et apparaissent dans la page de définition du produit comme les autres champs. .


Si vous avez besoin de plus d'aide, je peux vous fournir des images afin que vous puissiez mieux comprendre comment cela peut être fait.
nous sommes expérience et analyser, c'est une approche beaucoup plus souple

+1

Bien que cette solution semble "moche", c'est beaucoup mieux en termes de recherche. Le faire de la manière décrite dans la réponse acceptée rend très coûteux (en termes de performance) la recherche de nombreux champs. –

+0

Oui, Images/& Pseudocode serait vraiment utile. Je vous remercie! – Alex

10

Avoir une table qui stocke les noms de champs et les types.

field_ID  INT 
field_name VARCHAR 
field_type ENUM('int','float','text','richtext') 

ont une table qui stocke un lien vers une entrée dans la table d'enregistrement, un lien vers une entrée dans la table de terrain, et la valeur du champ.

fieldvalue_fieldID INT 
fieldvalue_recordID INT 
fieldvalue_value  BLOB 

Faire consultable est un autre défi - vous devez saisir tout contenu consultable sur ce fieldvalue_value et index. Ce serait spécifique à la base de données. En MySQL, vous pourriez en faire une valeur TEXT et y ajouter un index MySQL FULLTEXT.

+0

Compte tenu de votre exigence, c'est Probablement la façon la plus simple de faire les choses Bonne chance –

+1

Ah oui, l'anti-modèle EAV –

+1

Plus d'info [ici] (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2 % 80% 93value_model) et [ici] (http://programmers.stackexchange.com/questions/93124/eav-is-it-really-bad-in-all-scenarios) – thomasrutter

1

Vos meilleures options sont les suivantes:

  1. Permettre à l'utilisateur de modifier leur propre schéma de base de données, peut-être en téléchargeant un module ou l'exécution d'un script.

  2. Utilisez un champ XML et une base de données qui prend en charge les index et l'interrogation sur le contenu de ce champ

Ceux-ci sont recommandés par Martin Fowler, ici: http://martinfowler.com/bliki/UserDefinedField.html

Questions connexes