2011-07-28 8 views
5

Estoy ejecutando un sitio web que está comenzando a crecer más allá del simple rendimiento y el ajuste. Es una aplicación PHP con MySQL como back-end. MySQL está correctamente ajustado y el código está optimizado.Mejores prácticas para la desnormalización de datos de DB relacionales a no relacionales

Lo que pasa es que veo que puedo usar algún tipo de desnormalización para acelerar las cosas.

Supongamos que tiene un sitio similar a eBay o Amazon. Tiene productos en su base de datos con información relacionada (vendedor, clientes que compraron el producto, ciudad, estado, etc.). Eso sería tablas múltiples en una Base de Datos Relacional, y es bueno seguir así para hacer buenas consultas. Pero, por ejemplo, para la página de inicio, podría tener un único documento desnormalizado (por ejemplo, en MongoDB). Podría ser una colección con los últimos productos, denormalied, similar a esto:

products = { 
    { 
     id:13, 
     name:"Some product", 
     city:"aCity", 
     state:"aState", 
     price:"10" 
    }, 
    { 
     id:123, 
     name:"another product", 
     city:"aCity", 
     state:"aState", 
     price:"10" 
    } 
} 

De esta manera, podría colección de consulta que en lugar de la base de datos MySQL (con todas las combinaciones que participan) y las cosas podrían ponerse muy rápido.

Ahora, aquí está la pregunta. ¿Cuándo y cómo se desnormalizaría esa información? Por ejemplo, podría decidir que quiero desnormalizar los datos cuando se insertan.

Por lo tanto, en mi "create-product.php" (en pocas palabras). Podría hacer todo el "insertar en" para mysql, y después de eso podría hacer el save to the Mongo collection.

O simplemente podría ejecutar un programa en el servidor. O crea un cron para buscar los últimos productos.

Todas estas son posibilidades. ¿Qué haces? ¿Cuál es tu vencimiento?

Muchas gracias.

+0

Parece que está buscando un caché simple. – hakre

+0

Lo he intentado hakre. Pero prefiero a Mongo, no es tan rápido como Memcache, pero es persistente, algo que necesito en este momento. Gracias – santiagobasulto

+0

¿Qué le parece cambiar el backend de su chache a mongo y probarlo? – hakre

Respuesta

4

Conceptualmente está creando algún tipo de caché, y está previendo que llenarlo va a ser costoso en el tiempo, por lo tanto, quiere que sea persistente, bajo la suposición razonable de que va a cargar desde su caché persistente a más rápido que volver a la base de datos real.

Existen algunas variaciones en su idea, el almacenamiento en caché de fragmentos de página HTML o cadenas JSON, y el uso de una caché en memoria distribuida, no persistente pero tolerante a errores.

La gran pregunta con todas las soluciones de almacenamiento en caché es: "¿cuánto tiempo puedo permitirme?". Para algunos datos estar fuera de fecha las 24 horas realmente no importa. Por ejemplo: ¿Los 10 libros más populares? Las últimas revisiones, para aquellos solo una actualización por lotes va a hacer. Para cosas más urgentes, es posible que deba asegurarse de que haya una actualización más rápida, pero realmente quiere evitar poner demasiado procesamiento adicional en la corriente principal. Por ejemplo, sería una pena dar a un cliente una experiencia de compra lenta porque está esperando una actualización de un caché. En esos casos, puede dejar caer un mensaje de "Aquí hay una actualización" en una cola, o incluso un mensaje de "su entrada en el nunber 23 está ahora a punto de agotarse", deje que el caché lo recoja como su tiempo libre y, si es necesario, refrésquese.

+0

+1 para mencionar la cola de mensajes, y buena respuesta en general. –

+0

Muy buena respuesta djna. Muchas gracias. – santiagobasulto

Cuestiones relacionadas