¿Por qué usar MySQL para un sitio web de diccionario es una mala idea?


55

Estoy planeando diseñar y configurar una base de datos para almacenar entradas de diccionario (generalmente palabras sueltas) y su significado en otro idioma. Entonces, por ejemplo, la tabla Glosario debe tener entrada y definición y cada registro de la tabla tiene una referencia a la identificación de un registro almacenado en Tag(Cada entrada debe tener una etiqueta o categoría).

Como mis datos tienen una estructura, pensé que usar una base de datos SQL (como MySQL) no es una mala idea; pero la gente dice que MongoDB es mucho mejor para el rendimiento.

En el lado del cliente, la aplicación debe poder proporcionar un cuadro de búsqueda con autocompletado que consume una API REST proporcionada por el back-end. ¿Es seguro usar MySQL en este escenario? ¿o debo usar MongoDB o ElasticSearch de alguna otra solución para esto? Se supone que cientos de registros deben almacenarse y accederse de esta manera.


79
La gente que te dice cosas no ha investigado mucho sobre esto. El idioma con el vocabulario más extenso, el inglés, tiene menos de un millón de palabras distintas. Esto está dentro del ámbito de las capacidades de rendimiento de una base de datos relacional.
TheCatWhisperer

25
No veo nada aquí que me haga pensar que MySQL no funcionaría bien para eso. El rendimiento en una búsqueda simple no sería un problema, y ​​tiene una búsqueda de texto completo si necesita seguir esa ruta.
GrandmasterB

46
Con respecto a "MongoDB es mucho mejor para el rendimiento", como una declaración no modificada sin aclaración del alcance, esto no tiene sentido. Para ver un ejemplo, consulte Las herramientas de línea de comandos pueden ser 235 veces más rápidas que su clúster Hadoop (que encontré en un enlace en The Website Obesity Crisis ).
Comodín el

82
Estoy tan cansado de que la gente diga que las bases de datos relacionales son malas y que MongoDB es mejor porque es más rápido. Es como decir que los autos son malos y que debemos usar aviones porque viajan más rápido. Mi consejo es ignorar consejos como este.
Brandon

13
@Brandon Lo triste es que las afirmaciones "NoSQL es mucho más rápido" generalmente se reducen a alguna explicación teórica de por qué deberían ser mucho mejores, pero en la práctica eso ni siquiera se aplica a muchos escenarios del mundo real. Ver, por ejemplo, aquí . Su suite de referencia utilizada es de código abierto y también está disponible en github. Hell CERN gestiona su PB de datos con un OracleDB muy bien.
Voo

Respuestas:


95

No puedo decirte por qué es una mala idea. Sin embargo, puedo decirte muchas razones por las que una base de datos relacional es una buena idea.

  1. Recuerde que no todos consultan un diccionario para una definición. La mayoría de las veces, se usa un diccionario para encontrar la ortografía correcta. Esto significa que no solo está encontrando una aguja en un pajar , sino que está buscando agujas similares a la descrita por el usuario (si puedo usar un idioma).

    No solo estará haciendo búsquedas de claves principales. Harás búsquedas de palabras clave

  2. Las palabras pueden estar relacionadas, ya sea en significado u ortografía ( leer, leer , rojo y caña )

    Siempre que vea la palabra "relacionado" piense "Base de datos relacional"

  3. Si necesita velocidad, necesita almacenamiento en caché sobre su base de datos relacional, no un modelo de datos relacionales roto

  4. Una base de datos correctamente normalizada acelera las búsquedas y búsquedas de claves principales, ya que simplemente hay menos bits para examinar.

  5. Las personas que dicen que las bases de datos normalizadas son más lentas se refieren al 0.1% de los casos en que esto es cierto. En el otro 99.9% de los casos, en realidad no han trabajado con una base de datos realmente normalizada para ver el rendimiento de primera mano, así que ignórelos. He trabajado con una base de datos normalizada. Quiéralo. No quiero volver Y no soy un tipo de base de datos. Soy un chico de C # / JavaScript / HTML / Ruby.

  6. Las palabras tienen un origen. De hecho, muchas palabras en el mismo idioma pueden tener el mismo origen, que es otra palabra en un idioma diferente. Por ejemplo, currículum (lo que cargamos en los sitios web de reclutadores para que podamos recibir llamadas telefónicas y correos electrónicos incesantes durante los próximos 7 años) es una palabra francesa.

  7. Un diccionario también define qué tipo de palabra es (sustantivo, verbo, adjetivo, etc.). Esto no es solo un fragmento de texto: "sustantivo" también tiene significado. Además, con una base de datos relacional puedes decir cosas como "dame todos los sustantivos para el idioma inglés" y dado que una base de datos normalizada utilizará claves foráneas y las claves foráneas tienen (o deberían tener) índices, la búsqueda será muy fácil.

  8. Piensa en cómo se pronuncian las palabras. Especialmente en inglés, muchas palabras tienen la misma pronunciación (vea mi ejemplo anterior con read y reed, o read y red).

    La pronunciación de una palabra es, en sí misma, otra palabra. Una base de datos relacional le permitiría usar claves externas para cualquier pronunciación. Esa información no se duplicará en una base de datos relacional. Se duplica como loco en una base de datos sin SQL.

  9. Y ahora hablemos de las versiones en plural y singular de las palabras. :) Piense en "barco" y "barcos". O el hecho mismo de que una palabra es "singular" o "plural".

  10. Oh! Y ahora hablemos del tiempo pasado, el tiempo presente, el tiempo futuro y el participio presente (para ser sincero, no sé qué es el "participio presente". Creo que tiene algo que ver con las palabras que terminan en "ing" en Inglés o algo así).

    Busque "correr" y debería ver los otros tiempos: correr, correr, correr

    De hecho, "tiempo" es otra relación en sí misma.

  11. El inglés no hace mucho esto, pero el género es otra cosa que define una palabra. Idiomas como el español tienen sufijos que definen si el sujeto del sustantivo es masculino o femenino. Si necesita completar los espacios en blanco para una oración, el género es extremadamente importante en muchos idiomas.

    Dado que no siempre puede confiar en las convenciones del lenguaje para determinar el género (en español, las palabras que terminan en "o" son masculino / masculino, pero eso no es cierto para todas las palabras), necesita un valor de identificación: masculino o femenino. Esta es otra relación que una base de datos normalizada maneja con gracia incluso en millones de registros.

Con todas las reglas retorcidas y las relaciones entre las palabras, e incluso diferentes idiomas, me resulta difícil imaginar este almacén de datos como un "almacén de documentos" como lo proporciona una solución sin SQL. Hay tantas y una gran variedad de relaciones entre las palabras y sus componentes que una base de datos relacional es la única solución sensata.


77
Para el n. ° 1, la indexación es a menudo una de las fortalezas de las ofertas no relacionales, no una debilidad.
JimmyJames

61
@JimmyJames No piense ni por un minuto que los sistemas relacionales no están utilizando los mismos tipos de índices. Muchas de esas técnicas fueron pioneras en ese mundo.
Blrfl

14
"Siempre que vea la palabra" relacionada "piense en" Base de datos relacional "". No estoy de acuerdo El "relacional" en "base de datos relacional" se refiere a las tuplas mismas. Relacionado es un término demasiado amplio para que esta declaración contenga agua
cabeza de jardín

12
También hay bases de datos de gráficos (me viene a la mente Neo4j) que se centran explícitamente en atravesar relaciones en lugar de realizar uniones tradicionales. Esto puede ser ventajoso dado que muchos diccionarios son en realidad redes de palabras; por ejemplo, el proyecto de WordNet usa su propio formato gráfico, en lugar de un RDMS tradicional.
tucuxi

44
Voté esta respuesta solo por "Siempre que vea la palabra 'relacionado' piense 'Base de datos relacional'". Eso es ridículo . Me encantan las bases de datos relacionales, pero el modelo relacional no es apropiado para todo tipo de relaciones. Su visión de los datos normalizados también es completamente incorrecta. La normalización de datos optimiza las ediciones , porque los datos no están duplicados, no son búsquedas. (Es por eso que los informes de bases de datos no se normalizan. Usan técnicas de modelado dimensional y esquemas de estrellas.) No creo que sepa de lo que está hablando. Los 80 votos a favor confirman todas mis preocupaciones sobre el asesoramiento en este sitio.
jpmc26

27

Si va con la tienda de valores clave (que le ofrece un modelo de programación más empobrecido) y resulta que necesita más estructura (en su caso, por ejemplo, agregar un tercer idioma), o necesita hacer consultas más complejas que involucren uniones , pasará mucho tiempo reorganizando sus claves, desnormalizando sus datos y / o recorriendo todos los datos para encontrar lo que necesita.

Si comienza con una base de datos relacional, puede trabajar a través del diseño, el código de su aplicación y probar concentrándose más en el modelo de datos naturales para su aplicación, en lugar de calzarlo en la forma de valor clave.

Una vez que la aplicación se establece, puede trabajar en el rendimiento, midiendo varias opciones. Hay bastantes trucos de rendimiento para hacer en SQL antes de tener que cambiar de tecnología. Habrás aprendido mucho sobre tu aplicación y estarás en una posición mucho mejor para decidir si la relación te está perjudicando y si el valor-clave funcionará para tu modelo de datos.

Si resulta que el valor clave es exactamente lo que necesita su aplicación, puede cambiar sin haber desperdiciado una inversión significativa en el modelo relacional, mientras que al revés podría terminar perdiendo el tiempo haciendo que el modelo de valor clave haga cosas que son trivial en el modelo relacional.

Considere la base de datos relacional como un acelerador para diseñar, escribir y poner en funcionamiento su aplicación, ante los requisitos siempre cambiantes a medida que aprende más sobre su dominio y usuarios.

Cuando tenga millones de usuarios, seguramente necesitará refactorizar el diseño de todos modos, incluso si ha elegido un valor-clave para comenzar.


13
El epílogo de este artículo describe exactamente un escenario de cambio de requisitos que invalidan un diseño. Describe una aplicación (real) como "un caso de uso perfecto para MongoDB", pero luego describe cómo un cambio relativamente menor en los requisitos, que habría sido trivial de implementar en un RDBMS, requirió una cantidad decente de trabajo y lo habría movido a un caso de uso que (como explican las partes anteriores del artículo) no es un buen caso de uso de Mongo.
Derek Elkins

55
El artículo de Sarah MongoDB es exactamente lo que pasamos con un producto 1.0 que creamos al usarlo; por 1.1 estábamos usando Postgres.
Joe

@DerekElkins, super referencia, gracias!
Erik Eidt

1
"pero luego describe cómo un cambio relativamente menor en los requisitos, que habría sido trivial de implementar en un RDBMS" Claro, pero lo contrario es cierto. Utilizamos RDBMS en el trabajo y enfrentamos problemas que serían triviales de resolver en MongoDB. Por extraño que parezca, los requisitos de software no siempre se corresponden perfectamente con las capacidades de las herramientas que utilizamos.
NPSF3000

@ NPSF3000, ¡sería increíble si pudieras citar una referencia, como un blog o algún texto que explique sobre eso!
Erik Eidt

10

Para una base de datos tan pequeña, probablemente no habrá mucha diferencia en el rendimiento. Un RDBMS estándar no es una idea terrible aquí porque presumiblemente, debería haber muchas más lecturas que escrituras de una entrada determinada. El rendimiento no parece ser el principal impulsor de esto. El almacenamiento en caché en la capa de aplicación también mitiga tales preocupaciones.

La otra consideración es la replicación y la resistencia. Las bases de datos relacionales tienden a diseñarse en torno a una sola instancia. Debería leer el teorema CAP y considerar lo que más le importa.


¿Cómo se aplica CAP a una aplicación web relativamente normal? Dependiendo de su kit, es probable que pueda mantener miles de conexiones entrantes y una capa de almacenamiento en caché de la página puede aumentar eso en un orden de magnitud. CAP solo comienza a convertirse en algo que debe considerar cuando los sistemas distribuidos son la única forma de lograr su objetivo.
Ben

2
@Ben Resiliency es un objetivo en sí mismo. Si tener un solo punto de falla no es aceptable para una aplicación, las soluciones distribuidas ofrecen una solución. Las soluciones que no son RDBMS tienden a estar más orientadas hacia esto. No es simplemente volumen a considerar. La latencia y la disponibilidad son preocupaciones. Si su requisito es tener un tiempo de actividad del 99.9%. Solo puede estar inactivo durante aproximadamente 9 horas al año y perder los datos en una base de datos es catastrófico, por lo que debe tener en cuenta la replicación / copias de seguridad / instantáneas. Es erróneo pensar que necesariamente simplifica las cosas.
JimmyJames

2

Estas bases de datos NoSQL siempre parecen una buena idea desde el principio, pero se le garantizará tener problemas cuando comience a tratar casos extremos (por ejemplo, donde las palabras clave deben buscarse por su valor (o parte de), por ejemplo).

Sería una opción más segura ir con una base de datos relacional desde el principio y luego desnormalizar más tarde. MySQL es increíble para este tipo de propósito (bases de datos relacionales simples con búsqueda basada en texto), no hay demasiados casos de uso en los que encuentre dificultades con este tipo de datos. Solo asegúrese de tener sus índices configurados correctamente y verá que funcionará a un nivel comparable (o mejor al hacer una búsqueda de texto) a una base de datos NoSQL, y le dará la flexibilidad para modificar la lógica de su aplicación sin ser vinculado a una estructura de datos concreta.

A medida que encuentre el uso más común de sus datos (y si alguna vez encuentra que no satisface sus necesidades de rendimiento), puede proceder a desnormalizar los datos enviando a un formato establecido que se puede cargar (y recuperar) Un esquema NoSQL.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.