Pourquoi utiliser MySQL pour un site Web avec dictionnaire est-il une mauvaise idée?


55

Je prévois de concevoir et de configurer une base de données pour stocker les entrées de dictionnaire (généralement des mots simples) et leur signification dans une autre langue. Ainsi, par exemple, le glossaire de table doit avoir une entrée et une définition et chaque enregistrement de table contient une référence à l' id d'un enregistrement stocké dans Tag(chaque entrée doit avoir une étiquette ou une catégorie).

Puisque mes données ont une structure, je pensais que l’utilisation d’une base de données SQL (comme MySQL) n’était pas une mauvaise idée. mais les gens disent que MongoDB est bien meilleur pour la performance.

Du côté du client, l’application doit pouvoir fournir une zone de recherche avec la saisie semi-automatique qui utilise une API REST fournie par le backend. Est-il prudent d’utiliser MySQL dans un tel scénario? ou devrais-je utiliser MongoDB ou ElasticSearch avec une autre solution? Des centaines de milliers d'enregistrements sont supposés être stockés et accessibles de cette manière.


79
Les gens qui vous disent des choses n'ont pas fait beaucoup de recherches à ce sujet. La langue avec le plus grand vocabulaire, l'anglais, compte moins d'un million de mots distincts. Cela relève bien des capacités de performance d’une base de données relationnelle.
TheCatWhisperer

25
Je ne vois rien ici qui me ferait penser que MySQL ne fonctionnerait pas bien pour cela. La performance sur une simple recherche ne serait pas un problème, et il y a une recherche en texte intégral si vous devez aller dans cette direction.
GrandmasterB

46
En ce qui concerne "Les performances de MongoDB sont bien meilleures" - en tant qu'énoncé non modifié sans précision sur la portée, il s'agit d'un non-sens des rangs. Pour un exemple, voir Les outils de ligne de commande peuvent être 235x plus rapides que votre cluster Hadoop (que je suis tombé sur un lien dans The Website Obesity Crisis ).
Wildcard

82
J'en ai assez des gens qui disent que les bases de données relationnelles sont mauvaises et que MongoDB est meilleur car plus rapide. C'est comme dire que les voitures sont mauvaises et que nous devrions utiliser des avions parce qu'ils voyagent plus vite. Mon conseil est d'ignorer un conseil comme celui-ci.
Brandon

13
@Brandon Ce qui est triste, c'est que les affirmations "NoSQL est tellement plus rapide" se résument généralement à une explication théorique de la raison pour laquelle elles devraient être tellement meilleures, mais dans la pratique, cela ne s'applique même pas à de nombreux scénarios du monde réel. Voir par exemple ici . Leur suite de tests utilisée est open source et également disponible sur github. Hell CERN gère son PB de données avec un OracleDB très bien.
Voo le

Réponses:


95

Je ne peux pas vous dire pourquoi c'est une mauvaise idée. Je peux cependant vous expliquer de nombreuses raisons pour lesquelles une base de données relationnelle est une bonne idée.

  1. Rappelez-vous que tout le monde ne consulte pas un dictionnaire pour une définition. Plus souvent qu'autrement, un dictionnaire est utilisé pour trouver l'orthographe correcte. Cela signifie que vous ne trouvez pas simplement une aiguille dans une botte de foin , vous recherchez des aiguilles similaires à celle décrite par l'utilisateur (si je peux utiliser un idiome).

    Vous ne ferez pas simplement des recherches de clés primaires. Vous ferez des recherches par mot clé

  2. Les mots peuvent être liés, soit dans le sens, soit dans l'orthographe ( lire, lire , rouge et roseau )

    Chaque fois que vous voyez le mot "lié" pensez "Base de données relationnelle"

  3. Si vous avez besoin de rapidité, vous avez besoin d'une mise en cache sur votre base de données relationnelle, et non d'un modèle de données relationnel brisé.

  4. Une base de données correctement normalisée accélère les recherches et les recherches de clés primaires car il y a tout simplement moins de bits à parcourir.

  5. Les personnes qui affirment que les bases de données normalisées sont plus lentes se réfèrent aux 0,1% de cas où cela est vrai. Dans 99,9% des cas, ils n’ont pas réellement travaillé avec une base de données véritablement normalisée pour voir les performances de première main, alors ignorez-les. J'ai travaillé avec une base de données normalisée. Aimer. Je ne veux pas y retourner. Et je ne suis pas un gars de base de données. Je suis un gars C # / JavaScript / HTML / Ruby.

  6. Les mots ont une origine. En fait, plusieurs mots de la même langue peuvent avoir la même origine, ce qui est un autre mot dans une langue différente. Par exemple, résumé (ce que nous téléchargeons sur les sites Web des recruteurs pour pouvoir recevoir des appels téléphoniques et des courriels incessants pour les 7 prochaines années) est un mot français.

  7. Un dictionnaire définit également le type de mot (nom, verbe, adjectif, etc.). Ce n'est pas juste un morceau de texte: "nom", il a aussi un sens. De plus, avec une base de données relationnelle, vous pouvez dire des choses telles que "donnez-moi tous les noms pour la langue anglaise" et, comme une base de données normalisée utilisera des clés étrangères, et que les clés étrangères ont (ou devraient avoir) des index, la recherche se fera en un clin d'œil.

  8. Pensez à la façon dont les mots sont prononcés. En anglais en particulier, beaucoup de mots ont la même prononciation (voir mon exemple ci-dessus avec read et reed, ou read et red).

    La prononciation d'un mot est, en soi, un autre mot. Une base de données relationnelle vous permettrait d'utiliser des clés étrangères pour toutes les prononciations. Ces informations ne seront pas dupliquées dans une base de données relationnelle. Il est dupliqué comme un fou dans une base de données sans SQL.

  9. Et maintenant parlons des versions plurielles et singulières des mots. :) Pensez "bateau" et "bateaux". Ou le fait même qu'un mot est "singulier" ou "pluriel".

  10. Oh! Et maintenant parlons du passé, du présent, du futur et du participe présent (pour être honnête, je ne sais pas ce que c’est que le "présent participe". Je pense que cela a quelque chose à voir avec les mots qui se terminent par "ing" dans Anglais ou quelque chose).

    Cherchez "run" et vous devriez voir les autres temps: couru, court, courant

    En fait, le «temps» est une autre relation elle-même.

  11. L'anglais ne le fait pas tellement, mais le genre est une autre chose qui définit un mot. Les langues comme l’espagnol ont des suffixes qui définissent si le sujet du nom est masculin ou féminin. Si vous devez remplir les blancs d'une phrase, le genre est extrêmement important dans de nombreuses langues.

    Etant donné que vous ne pouvez pas toujours compter sur les conventions linguistiques pour déterminer le sexe (en espagnol, les mots finissant par "o" sont masculins / masculins, mais ce n'est pas le cas pour tous les mots), vous avez besoin d'une valeur d'identification: masculin ou féminin. C'est une autre relation qu'une base de données normalisée gère normalement même avec des millions d'enregistrements.

Avec toutes les règles tordues et les relations entre les mots, et même différentes langues, il m'est difficile d'imaginer ce magasin de données comme un "magasin de documents" comme le fournit une solution sans SQL. Il existe une telle variété de relations entre les mots et leurs composants qu'une base de données relationnelle est la seule solution sensée.


7
Pour le n ° 1, l'indexation est souvent l'un des points forts des offres non relationnelles, pas une faiblesse.
JimmyJames

61
@ JimmyJames Ne pensez pas un instant que les systèmes relationnels n'utilisent pas les mêmes types d'index. Beaucoup de ces techniques ont été inventées dans ce monde.
Blrfl

14
"Chaque fois que vous voyez le mot" lié "pensez" Base de données relationnelle "". Je ne suis pas d'accord Le terme "relationnel" dans "base de données relationnelle" fait référence aux nuplets eux-mêmes. Related est un terme beaucoup trop large pour que cette déclaration soit
valable

12
Il existe également des bases de données de graphes (Neo4j vient à l’esprit) qui sont explicitement centrées sur le croisement de relations plutôt que sur les jointures traditionnelles. Cela peut être avantageux étant donné que de nombreux dictionnaires sont en réalité des bandes de mots; Par exemple, le projet WordNet utilise son propre format graphique, au lieu d'un RDMS traditionnel.
Tucuxi

4
J'ai voté en faveur de cette réponse juste pour "Chaque fois que vous voyez le mot" lié ", pensez à" Base de données relationnelle "." C'est ridicule . J'aime les bases de données relationnelles, mais le modèle relationnel ne convient pas à toutes sortes de relations. Votre vue des données normalisées est également complètement fausse. La normalisation des données optimise les modifications , car les données ne sont pas dupliquées, pas les recherches. (C'est pourquoi les bases de données de rapports ne se normalisent pas. Elles utilisent des techniques de modélisation dimensionnelle et des schémas en étoile.) Je ne pense pas que vous sachiez de quoi vous parlez. Les 80 votes positifs confirment toutes mes préoccupations concernant les conseils fournis sur ce site.
jpmc26

27

Si vous optez pour le magasin clé-valeur (qui vous offre un modèle de programmation plus appauvri) et qu'il s'avère que vous avez besoin de plus de structure (dans votre cas, par exemple, l'ajout d'un troisième langage), ou que vous devez effectuer des requêtes plus complexes impliquant des jointures. , vous passerez beaucoup de temps à réorganiser vos clés, à dénormaliser vos données et / ou à parcourir toutes les données pour trouver ce dont vous avez besoin.

Si vous commencez avec une base de données relationnelle, vous pouvez travailler sur la conception, le code et l’essayer de votre application en vous concentrant davantage sur le modèle de données naturel de votre application, plutôt que de le placer dans le formulaire valeur-clé.

Une fois l'application installée, vous pouvez travailler sur les performances en mesurant diverses options. Avant de devoir changer de technologie, il y a pas mal d’astuces de performance en SQL. Vous aurez beaucoup appris sur votre application et serez beaucoup mieux placé pour décider si les relations relationnelles vous font mal et si la valeur-clé fonctionnera pour votre modèle de données.

S'il s'avère que la valeur-clé correspond exactement aux besoins de votre application, vous pouvez passer sans avoir à perdre un investissement considérable dans le modèle relationnel, alors que l'inverse pourrait vous faire perdre du temps à faire en sorte que le modèle clé-valeur trivial dans le modèle relationnel.

Considérez la base de données relationnelle comme un accélérateur pour la conception, l’écriture et le bon fonctionnement de votre application, malgré les exigences en constante évolution, à mesure que vous en apprenez plus sur votre domaine et vos utilisateurs.

Lorsque vous avez des millions d'utilisateurs, vous aurez certainement besoin de refactoriser le design, même si vous aviez choisi la valeur-clé pour commencer.


13
L'épilogue dans cet article décrit exactement un scénario de modification des exigences qui invalide une conception. Il décrit une application (réelle) comme "un cas d'utilisation parfait pour MongoDB", puis explique comment une modification relativement mineure des exigences, qu'il aurait été trivial de mettre en œuvre dans un SGBDR, nécessitait une quantité de travail décente et l'aurait déplacée. à un cas d'utilisation qui (comme l'expliquent les parties précédentes de l'article) n'est vraiment pas un bon cas d'utilisation de Mongo.
Derek Elkins

5
L'article de Sarah sur MongoDB est exactement ce que nous avons vécu avec un produit 1.0 que nous avions construit en l'utilisant; en 1.1, nous utilisions Postgres.
Joe

@ DerekElkins, super référence, merci!
Erik Eidt

1
"mais décrit ensuite comment une modification relativement mineure des exigences, qu’il aurait été trivial de mettre en œuvre dans un SGBDR" Bien sûr, mais l’inverse est vrai. Nous utilisons les SGBDR au travail et faisons face à des problèmes qu'il serait facile de résoudre dans MongoDB. Curieusement, les exigences logicielles ne correspondent pas toujours parfaitement aux capacités des outils que nous utilisons.
NPSF3000

@ NPSF3000, ce serait génial si vous pouviez citer une référence, comme un blog ou un texte expliquant cela!
Erik Eidt

10

Pour une base de données aussi petite, cela ne fera probablement pas beaucoup de différence en termes de performances. Un SGBDR standard n’est pas une très mauvaise idée ici, car on peut supposer qu’il devrait y avoir beaucoup plus de lectures que d’écritures pour une entrée donnée. Les performances ne semblent pas être le principal facteur pour cela. La mise en cache dans la couche d'application atténue également ces préoccupations.

L'autre considération est la réplication et la résilience. Les bases de données relationnelles ont tendance à être conçues autour d'une seule instance. Vous devriez lire le théorème de la PAC et réfléchir à ce qui compte le plus pour vous.


Comment la PAC s'applique-t-elle à une application Web relativement normale? En fonction de votre kit, il est probable que vous puissiez supporter des milliers de connexions entrantes et une couche de mise en cache de page peut l’augmenter considérablement. La PAC commence seulement à devenir un élément à prendre en compte lorsque les systèmes distribués sont le seul moyen d’atteindre votre objectif.
Ben

2
@Ben La résilience est un objectif en soi. Si le fait d'avoir un point de défaillance unique n'est pas acceptable pour une application, les solutions distribuées offrent une solution. Les solutions non-SGBDR ont tendance à être plus orientées vers cela. Ce n'est pas simplement le volume à considérer. La latence et la disponibilité sont des préoccupations. Si votre exigence est d'avoir un temps de disponibilité de 99,9%. Vous ne pouvez vous arrêter que pendant environ 9 heures par an et la perte des données dans une base de données est catastrophique. Vous devez donc prendre en compte la réplication / les sauvegardes / les instantanés. Il est erroné de penser que cela simplifie nécessairement les choses.
JimmyJames

2

Ces bases de données NoSQL sonnent toujours comme une bonne idée au départ, mais vous aurez sûrement des problèmes lorsque vous commencerez à traiter des cas extrêmes (par exemple, lorsque les mots clés doivent être recherchés par leur valeur (ou une partie de ceux-ci), par exemple.

Il serait plus sûr d’opter pour une base de données relationnelle au début, puis de la dénormaliser plus tard. MySQL est génial pour ce type d’objet (bases de données relationnelles simples avec recherche textuelle), il n’ya pas beaucoup de cas d’utilisation dans lesquels vous constaterez des difficultés avec ce type de données. Assurez-vous simplement que vos index sont configurés correctement et que vous constaterez qu’ils fonctionneront à un niveau comparable (ou supérieur lorsqu’une recherche de texte) à une base de données NoSQL. Vous aurez ainsi la possibilité de modifier la logique de votre application sans être gêné. lié à une structure de données concrète.

Au fur et à mesure que vous trouvez l'utilisation la plus courante de vos données (et si vous trouvez que cela ne correspond pas à vos besoins en performances), vous pouvez alors procéder à la dé-normalisation des données en générant dans un format prédéfini qui peut être chargé (et récupéré). un schéma NoSQL.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.