Cómo diseñar almacenamiento de datos para un sistema de etiquetado enorme (como digg o delicious)?¿Cómo diseñar el almacenamiento de datos para el sistema de etiquetado particionado?
Ya existe discussion al respecto, pero se trata de una base de datos centralizada. Dado que se supone que los datos crecerán, tendremos que dividir los datos en fragmentos múltiples pronto o después. Entonces, la pregunta es: ¿Cómo diseñar el almacenamiento de datos para el sistema de etiquetado particionado?
El sistema de etiquetado básicamente tiene 3 mesas:
Item (item_id, item_content)
Tag (tag_id, tag_title)
TagMapping(map_id, tag_id, item_id)
que funciona bien para encontrar todos los artículos de etiqueta dada y encontrar todas las etiquetas para el tema dado, si la tabla se almacena en una base de datos de instancia. Si necesitamos dividir los datos en varias instancias de bases de datos, no es tan fácil.
Para la mesa artículo, que puede particionar su contenido con su clave item_id. Para la tabla Tag, podemos dividir su contenido con su clave tag_id. Por ejemplo, queremos dividir la tabla Tag en K bases de datos. Simplemente podemos elegir el número (tag_id% K) para almacenar la etiqueta dada.
Pero, ¿cómo dividir la tabla TagMapping?
TagMapping tabla representa la relación muchos a muchos. Solo puedo obtener una imagen para tener una duplicación. Es decir, el mismo contenido de TagMappping tiene dos copias. Uno está particionado con tag_id y el otro está particionado con item_id. En el escenario para encontrar etiquetas para un elemento dado, utilizamos la partición con tag_id. Si el escenario para encontrar elementos para la etiqueta dada, usamos la partición con item_id.
Como resultado, hay redundancia de datos. Y, el nivel de aplicación debe mantener la consistencia de todas las tablas. Parece difícil.
¿Hay alguna solución mejor para resolver este problema de partición de muchos a muchos?
No estoy seguro de que la idea de items_id combinados sea buena. La popularidad cambia a tiempo. También es difícil adivinar la popularidad/rango de página/lo que sea al crear un registro (ese es el momento en el tiempo, cuando se debe calcular item_id combinado). – Wacek
Sí, estoy de acuerdo y normalmente no recomendaría valores de codificación en una ID. La popularidad cambia con el tiempo, pero no demasiado rápido. Si mover elementos entre particiones no es demasiado difícil, todavía puede ser un enfoque correcto. Puede usar otra ID para cada elemento en 'TagMapping' que pueda cambiar más fácilmente con el tiempo (en lugar de la clave principal del elemento que probablemente se use en muchos otros lugares). Un proceso en segundo plano podría volver a calcular gradualmente estos nuevos ID y reorganizar los registros en 'TagMapping' para reflejar los cambios en la popularidad. –