Cette question est très similaire à la question précédente Conception d'une base de données pour une enquête , Cependant, l'auteur de la question n'a pas précisé la quantité de données qu'il traitait, le type de données et ce qu'il devait en faire, et je pense que cela a beaucoup d'importance.
J'ai donc été chargé d'ajouter une fonction de sondage à une application. L'application doit gérer 50 organisations distinctes, chaque organisation ayant jusqu'à 500 enquêtes. Chaque enquête comprendra jusqu'à 150 questions et stockera des données allant du vrai/faux, des dates, etc. jusqu'à des paragraphes de texte. Il sera possible de répondre jusqu'à 10 000 fois à chaque enquête.
Je vois trois façons principales de concevoir la base de données pour répondre à ce besoin.
- Un seul tableau pour toutes les questions, et un autre pour toutes les réponses, par exemple.
Table des questions : [ survey_id, question ] etc
Table des réponses : [ question_id, answer]
-
Un tableau pour chaque enquête, avec un champ pour chaque question
-
Une base de données pour chaque client... (c'est un joker lancé par un collègue, je suis très sceptique à ce sujet)
Bien que j'aime l'idée de l'option 1, il y a quelques problèmes. Nous stockerons jusqu'à 38 milliards de lignes, le champ de réponse devra être un champ de texte, ce qui rendra les requêtes et le tri par date, par exemple, très lents. Des rapports en temps réel sont attendus avec cette application.
Compte tenu de la quantité de données et des exigences en matière de rapports, je me sens obligé d'envisager de créer les tables de manière dynamique. Les données ne sont pas sujettes à modification une fois créées en raison du champ dans lequel elles sont utilisées ; si un changement est nécessaire, tout est supprimé et recommencé ; je ne crains donc pas d'avoir à effectuer des mises à jour de schéma en cours d'enquête. Le principal problème que je vois est le nombre de tables : 25 000 tables, c'est beaucoup, et je ne suis pas sûr que ce soit mieux que d'interroger 38 milliards de lignes de données mal structurées, ni même qu'il y ait des limites à ne pas dépasser. Le seul avantage est que nous pouvons être sûrs à 100% qu'il n'y aura pas de jointures de tables et qu'il est peu probable que plus de 500 tables différentes soient évaluées en une journée.
Je ne suis pas sûr du fonctionnement interne de MySql (la base de données actuellement utilisée par le client), mais je ne pense pas que le fait de la diviser en plusieurs bases de données fasse beaucoup de différences sur le même serveur ? Cela dit, j'ai la possibilité d'utiliser la base de données de mon choix.
Quelle est la meilleure approche dans ce scénario et existe-t-il une quatrième option que je n'ai pas envisagée ?