sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo manejar documentos circulares en MongoDB/DynamoDB?

Mientras que NoSQL generalmente recomienda desnormalización de modelos de datos, es mejor no tener una lista ilimitada en una sola entrada de base de datos. Para modelar estos datos en DynamoDB, debe usar un lista de adyacencia para modelar la relación de muchos a muchos . No hay rentable forma de modelar los datos, que yo sepa, para permitirle obtener todos los datos que desea en una sola llamada. Sin embargo, ha dicho que la velocidad es lo más importante (sin especificar un requisito de latencia), por lo que intentaré darle una idea de qué tan rápido puede obtener los datos si se almacenan en DynamoDB.

Sus esquemas se convertirían en algo como esto:

Actor {
    ActorId, <-- This is the application/database id, not the actor's actual ID
    Name,
    Age,
    Bio
}

Film {
    FilmId, <-- This is the application/database id for the film
    Title,
    Description,
    ReleaseDate
}

ActedIn {
    ActorId,
    FilmId
}

Para indicar que un actor actuó en una película, solo necesita realizar una escritura (que, según mi experiencia, es consistentemente en milisegundos de un solo dígito usando DynamoDB) para agregar un elemento ActedIn a su tabla.

Para obtener todas las películas de un actor, debe consultar una vez para obtener todas las relaciones actuadas y luego una lectura por lotes para obtener todas las películas. Las latencias típicas para una consulta (según mi experiencia) son inferiores a 10 ms, según las velocidades de la red y la cantidad de datos que se envían a través de la red. Dado que la relación ActedIn es un objeto tan pequeño, creo que podría esperar un caso promedio de 5 ms para una consulta, si su consulta se origina en algo que también se ejecuta en un centro de datos de AWS (EC2, Lambda, etc.).

Obtener un solo elemento será inferior a 5 ms, y puede hacerlo en paralelo. También hay una API BatchGetItems, pero no tengo ninguna estadística para usted al respecto.

Entonces, ¿10 ms es lo suficientemente rápido para ti?

Si no, puede usar DAX , que agrega una capa de almacenamiento en caché a DynamoDB y promete una latencia de solicitud de <1 ms.

¿Cuál es la manera imposible de mantener y no rentable de hacer esto en una sola llamada?

Para cada relación de ActedIn, almacene sus datos de esta manera:

ActedIn {
    ActorId,
    ActorName,
    ActorAge,
    ActorBio,
    FilmId,
    FilmTitle,
    FilmDescription,
    FilmReleaseDate
}

Solo necesita realizar una consulta para cualquier actor dado para obtener todos los detalles de su película, y solo una consulta para obtener todos los detalles del actor para una película determinada. En realidad, no hagas esto. Los datos duplicados significan que cada vez que tiene que actualizar los detalles de un actor, debe actualizarlos para cada película en la que estuvo, y de manera similar para los detalles de la película. Esto será una pesadilla operativa.

No estoy convencido; parece que NoSQL es terrible para esto.

Debe recordar que NoSQL viene en muchas variedades (NoSQL =Not Only SQL), por lo que incluso si una solución NoSQL no funciona para usted, no debe descartarla por completo. Si absolutamente necesita esto en una sola llamada, debería considerar usar una Base de datos de gráficos (que es otro tipo de base de datos NoSQL).