2010-10-11 3 views
8

J'ai essayé de répondre à un problème complexe de structure de données Mysql pour les champs personnalisés pour une application en ligne. Je suis assez nouveau à Mysql donc toute contribution est appréciée.Array, EAV, LOB sérialisé pour les champs personnalisés?

La base de données actuelle est une base de données relationnelle et chaque utilisateur du service partagera la même base de données et les mêmes tables.

Voici un exemple de ce que j'essaie de faire.

Disons que j'essaie de créer une liste. Cette liste peut contenir jusqu'à 30 champs personnalisés. L'utilisateur peut choisir entre 12 éléments uniques et chaque élément peut avoir jusqu'à 15 attributs définis par l'utilisateur.

Chaque liste peut être unique dans un compte ainsi qu'entre plusieurs comptes. Les comptes peuvent avoir de nombreuses listes et chaque liste peut avoir différentes quantités d'éléments ainsi que différents attributs par élément.

Un élément peut être beaucoup de choses, par exemple: choix multiple, bouton radio, champ de téléphone, adresse, unique ligne de texte, texte multi-lignes, etc.

Un exemple d'attributs pour un choix multiple (case à cocher L'élément pourrait être: rouge, vert, bleu, orange, blanc, noir

Un exemple d'élément de texte à ligne unique pourrait être: Champ de saisie Prénom. Chaque élément doit également avoir un champ de titre et un champ d'étiquette définis par l'utilisateur qui peuvent être référencés et utilisés dans d'autres fonctions de l'application.

La segmentation est également très importante. Un utilisateur doit pouvoir segmenter une liste en fonction de n'importe quel élément. Par exemple, un utilisateur peut vouloir segmenter la liste "ABC" en se basant sur tous les enregistrements où "rouge" est présent dans l'élément à choix multiples n ° 1 (ils peuvent avoir plus d'un élément à choix multiples pour une liste).

Dans cet exemple, je suppose que les tableaux EAV, Serialized LOB fonctionneraient correctement. Cependant, je ne suis pas sûr de ce qui serait la meilleure structure pour mes besoins à mon échelle.

En réalité, il y aura probablement jusqu'à 50 000 enregistrements par liste et il y a une possibilité réelle de plus de 20 000 comptes - chacun avec de nombreuses listes. Par conséquent, je suis à la recherche de la structure la plus efficace et la plus flexible.

Pour rendre les choses encore plus complexes, j'ai également besoin d'assurer un moyen efficace d'ajouter/supprimer des éléments à une liste particulière à un moment donné. Par exemple, si un utilisateur crée une liste avec le nombre maximum autorisé de champs personnalisés (30) et trois mois plus tard décide qu'il veut supprimer un champ, j'ai besoin d'un moyen de trouver cette liste et toutes les valeurs associées pour ce champ personnalisé. puis supprimez toutes les valeurs, le type d'élément et ses attributs. L'utilisateur serait alors autorisé à ajouter un nouvel élément à cette liste.

J'ai passé en revue de nombreux messages EAV sur ce site, ainsi que cela http://www.martinfowler.com/eaaCatalog/serializedLOB.html Il ne semble pas que EAV serait très efficace pour mes besoins en raison des inconvénients de la récupération de données.

Je me demandais aussi comment un réseau multidimensionnel fonctionnerait à cette échelle? Je crois que wordpress utilise cela pour leurs champs personnalisés.

Toute contribution serait grandement appréciée quant à la meilleure façon de structurer la base de données pour cette situation. Je vous remercie!

+0

Je suis également confronté au même défi - quelle solution avez-vous suivi? Je serais très intéressé par vos expériences. – philwilks

Répondre

0

Vous pouvez utiliser json enconding et décoder (je suppose que vous utilisez PHP) pour stocker les informations d'entrée dans une table avec une colonne pour stocker l'utilisateur et d'autres pour stocker ces données sous forme de texte. Les réponses doivent être stockées dans une autre table (avec un FK pour utiliser CASCADE ON DELETE).

Si vous pouvez spécifier la taille maximale de la spécification d'entrée, utilisez un champ varchar.

Cela ne peut pas être le meilleur aprouch (besoin de quelques tests de profilage pour s'assurer qu'il est assez robuste) mais peut être utilisé.

1

Vous pouvez lire sur la façon dont FriendFeed implémente les champs personnalisés: http://bret.appspot.com/entry/how-friendfeed-uses-mysql

Ils utilisent une combinaison de sérialisé LOB, avec des tables supplémentaires contenant des index inversés. Vous n'avez pas besoin d'une table supplémentaire pour chaque attribut possible dans votre LOB, seulement ceux que vous voulez rechercher avec l'aide d'un index.

+0

http://bret.appspot.com/entry/how-friendfeed-uses-mysql est introuvable –

+0

@wangyiran, pas surprenant, ce blog a plus de 6 ans. Je décris la même technique d'indexation inversée dans ma présentation ici: http://www.slideshare.net/billkarwin/extensible-data-modeling. –

Questions connexes