Quelles sont certaines methods pour conserver datatables configurables par le client dans une database?

Je cherche quelques idées sur les methods de persistance des données configurables par les clients dans une database relationnelle (SQL Server 2000 dans mon cas).

Par exemple, disons que vous avez une application de saisie de command standard dans laquelle votre client saisit un produit qu'il souhaite acheter. En plus des champs qui sont importants pour vous et le client (itemID, cost, etc.), vous voulez permettre au client d'entrer des informations qui leur sont pertinentes et de les conserver pour eux (pour une récupération ultérieure sur des rapports ou des factures ou autre) . Vous souhaitez également que l'étiquetage de ces "champs clients" soit configuré par le client. Ainsi, un client peut avoir un champ appelé "Numéro de facture", un autre client peut avoir deux champs appelés "Facture #" et "Facture Date" etc …

Je peux penser à quelques façons de le faire. Vous pouvez avoir une table customerfields avec un nombre raisonnable de champs varchar liés à chaque transaction, puis une autre table clientcustomerfields qui contient les métadonnées sur le nombre de champs utilisés par un client, les noms des champs, etc. Vous pouvez également utiliser XML pour conserver le datatables des clients afin que vous n'ayez pas à vous soucier du nombre X de champs, vous aurez toujours besoin d'un tableau pour décrire les méta-données des clients (peut-être via un XSD).

Existe-t-il des façons standard de faire ce genre de chose?

Vous devriez lire les meilleures pratiques pour la modélisation des données sémantiques pour les performances et l'évolutivité . C'est exactement la question abordée par le livre blanc dans le lien.

Une stratégie que j'utiliserais:

customer_fields
– field_id
– cusomer_id
– nom de domaine

customer_transaction_field_values
– identifiant de transaction
– field_id
– field_value

En guise de généralisation, je reorderais de ne pas utiliser de blobs XML opaques pour stocker des données orientées champs dans une database relationnelle.

  1. La meilleure solution est d'avoir des champs 'user' et une configuration dans l'application pour configurer comment ces champs sont utilisés et présentés. Si les champs sont des varchars, le surcoût pour les champs vides est assez minime, IIRC environ 1 octet par champ. Bien que cela semble inélégant et possède un nombre fini de champs, c'est le plus simple à interroger et à remplir ce qui le rend le plus rapide. Une option serait de rendre la configuration agnostique au nombre de champs et d'exécuter simplement un script pour append quelques champs supplémentaires si vous en avez besoin.

  2. Une autre option consiste à avoir une table 'coding' suspendue des entités dont les champs configurables par l'user. Il contient des colonnes 'ID de l'entité', 'type de champ' et 'code de champ' où la colonne 'type de champ' indique le contenu réel. L'inconvénient particulier est que cela rend les requêtes plus lentes car elles doivent potentiellement se joindre plusieurs fois à cette table.

J'ai effectivement vu les deux (1) et (2) en cours d'utilisation sur le même système. Le fournisseur a commencé à l'origine avec (2) mais a ensuite trouvé que c'était une douleur dans le cul et les sous-systèmes suivants sur l'application sont allés à l'aide de (1). Ce changement d'approche est le fruit d'une expérience amère.

La grève principale contre les blobs XML est qu'ils ne sont pas des citoyens de première class dans le schéma de la database. Le SGBD ne peut pas appliquer l'intégrité référentielle sur le blob lui-même, il ne peut pas indexer des colonnes individuelles dans le blob et l'interrogation des données du blob est plus complexe et peut ne pas être prise en charge par les outils de reporting. De plus, le contenu du blob est complètement opaque au dictionary de données du système. Toute personne essayant d'extraire datatables hors du système dépend de la documentation de l'application pour avoir un aperçu du contenu.

En plus de vos propres suggestions, une autre façon est de regarder le système de fournisseur de profil dans ASP.net (en supposant une stack de technologie MS sur ce point). Vous pouvez étendre la ProfileBase pour inclure 2 arrays représentant vos keys définies par l'user et un autre pour les valeurs correspondantes. À ce stade, le SqlProfileProvider gère le stockage et la récupération de tels et créer votre implémentation de l'object ProfileBase. En fin de count, ce serait similaire à si vous essayiez d'utiliser le système ProfileProvider dans un projet d'application Web et non un projet de site Web (qui utilise des gestionnaires de construction différents).

Je l'ai fait dans le passé et utilisé le concept de champs définis par l'user. Je voudrais créer quatre tables pour les types de base:

  1. UDFCharacter – id – int, order_id – int, valeur – varchar (4000)
  2. UDFNumber – id – int, order_id – int, valeur – float
  3. UDFDateTime – id – int, order_id – int, valeur – datetime
  4. UDFText – id – int, order_id – int, valeur – text

Je voudrais alors avoir une table qui décrit les champs avec leur type:

CustomField – id – int, customer_id – int (lié à la table client), fieldType – 'UDFCharacter, UDFNumber, etc', name – varchar, et autres informations méta

Les réponses aux champs vont dans les tables UDF. Les champs sont affichés sur la page en fonction de la table CustomField. Notre système était peut-être plus complexe et nécessitait plus de tbales mais cela semble fonctionner.