Je dois stocker une grande table (plusieurs millions ou lignes) qui contient un grand nombre de champs définis par l'utilisateur (inconnus au moment de la compilation, mais probablement entre 20 et 40 des champs). Il est très important (performance-sage) pour moi d'être en mesure d'interroger les données basées sur ces champs personnalisés, c'est-à-dire "Sélectionnez les lignes où cet attribut a cette valeur, cet attribut est cette valeur, etc." Chaque requête comporte de 20 à 30 clauses WHERE.Implémentation et indexation des champs définis par l'utilisateur dans un DB SQL
Mes idées à ce jour:
Changer le schéma de base de données chaque fois qu'un nouveau champ utilisateur est mis en œuvre. Conservez chaque champ défini par l'utilisateur en tant que colonne dans la table. Ajoutez et maintenez des index sur chaque colonne personnalisée. Comment construire correctement ces index est un gros problème, car je ne sais pas quels attributs (colonnes) seront utilisés dans les requêtes WHERE.
Stockez les champs personnalisés en tant que colonne de type XML. Comme je comprends de SQL2005 je peux interroger à l'intérieur du XML dans les colonnes de type XML. Pas si sûr de la performance cependant.
Entity Attribute Value. C'est ce que j'utilise maintenant, mais c'est une douleur.
Une suggestion?
Modifier: Quelques précisions sur mes besoins. J'ai une table, 40 à 50 millions de lignes de numéros (disons) ID et divers attributs associés à ces ID.
Disons que 20 millions d'entre eux ont « CustomAttribute1 » égal à 2, puis 5 millions ont « CustomAttribute2 » égal à « Oui » et 3 millions ont « CustomAttribute20 » égal à « Non »
I need a FAST method of returning all IDs where:
1. CustomAttribute1 = 2
2. CustomAttribute2 = 'Yes'
3. CustomAttribute4 = null
4. CustomAttribute20 != 'No'
etc...
Nous ceci est implémenté comme EAV: la requête select est un cauchemar à implémenter et maintenir, il faut beaucoup de temps pour retourner le résultat, et le plus anormalement le DB évolue vers des tailles énormes même pour de petites quantités de données, ce qui est bizarre puisque l'EAV est essentiellement Normaliser les données mais je suppose que tous les index prennent beaucoup d'espace.
Pouvez-vous clarifier ce que vous faites avec ceci, c'est-à-dire quel type de données est dans le tableau. De plus, ces champs personnalisés sont-ils les seules colonnes? –