2010-05-18 8 views
19

El cofundador de Reddit hizo una presentación sobre los problemas que tenían mientras escalaba a millones de usuarios. Un resumen está disponible here.Base de datos con "Esquema abierto" - ¿Buena o mala idea?

Lo que me sorprendió es el punto 3:

En su lugar, mantener una tabla cosa y una tabla de datos. Todo en Reddit es una cosa: usuarios, enlaces, comentarios, subreddits, premios, etc. Las cosas mantienen el atributo común como votos arriba/abajo, un tipo y fecha de creación. La tabla de datos tiene tres columnas: id de cosa, clave, valor. Hay una fila para cada atributo. Hay una fila para el título, la URL, el autor, los votos no deseados, etc. Cuando agregan nuevas funciones, ya no tienen que preocuparse por la base de datos. No tenían que agregar nuevas tablas para cosas nuevas o preocuparse por las actualizaciones.

Esto me parece una idea terrible, pero parece haber funcionado para Reddit. Sin embargo, ¿es una buena idea en general? ¿O es una peculiaridad de Reddit lo que sucedió que funcionó para ellos?

Respuesta

16

Se trata de un modelo de datos conocido como EAV para entidad-valor-atributo. Tiene sus usos. Un buen ejemplo es la información de prueba del paciente, que es naturalmente escasa, ya que existen cientos de miles de pruebas que se pueden ejecutar, pero normalmente solo un puñado está presente para un paciente. Una tabla con cientos de miles de columnas es tonta, pero una tabla con EAV tiene sentido.

7

Noté que no mencionaban nada sobre la facilidad o dificultad para crear informes en contra de esa información. Cuando se usan en un conjunto estrecho de circunstancias, los EAV pueden ser beneficiosos. Como parte central de la mayoría de los sistemas, se convertirá en una pesadilla cuando aciertes a informar. El problema con los EAV es que la mayor parte del beneficio se encuentra al comienzo del proyecto y la mayor parte del dolor se ve más adelante en el análisis y la generación de informes, especialmente debido a la grave falta de integridad de los datos. "No tener que preocuparse por claves externas" para mí suena como una pesadilla de filas huérfanas. Agregue el uso de claves sustitutivas para todo y tenga un enredo enmarañado que generalmente termina en una reescritura completa

+0

De hecho, Huffman habla sobre la creación de informes y cómo lo hacen al exportar un conjunto de datos a un archivo de texto y analizarlo en otro lugar https://vimeo.com/10506751 m24: 50 –

+0

Reddit tiene pocos, si los hay requisitos de integridad de datos. No es como si estuvieran almacenando valores enteros o de fecha que deben estar entre ciertos rangos o tienen reglas comerciales complicadas. Es decir, la corrección de los datos no es realmente importante para un sitio como reddit; solo necesita ser mayormente correcto. Sin embargo, las aplicaciones LOB no son tan tolerantes con la inexactitud. El diseño de Reddit se centra en capturar datos, no en la corrección. Sin embargo, la cuestión de la corrección es que cuando te importa, es excesivamente costoso no abordarlo por adelantado. – Thomas

8

La mayoría de los sitios web realmente grandes terminan usando algo increíblemente simple en el lado de la base de datos. Esto tiene la ventaja de que es rápido y escalable. Tiene la desventaja de que todas las relaciones que obtendría la base de datos para hacer cumplir automáticamente (a través de activadores y demás) usted necesita para imponerse en su código de cliente. Mantener la consistencia es un dolor en el cuello, y casi siempre existe al menos alguna posibilidad de que sus datos sean inconsistentes, al menos por períodos cortos de tiempo.

Para un sitio de redes sociales, es un compromiso que vale la pena. La mayoría de los datos son correctos la mayor parte del tiempo (por ejemplo, a quién le importa realmente si la cantidad de votos que recibe para un artículo es en realidad de 20 milisegundos desactualizados cuando se envía), y manteniendo los costos razonables al escalar para admitir un trillón los usuarios importan mucho.

Cuestiones relacionadas