tutorial query nodejs example dynamodb create aws all python sql nosql amazon-dynamodb

python - query - Esquema de datos NoSQL adecuado para galería de fotos web



dynamodb tutorial (3)

Usando DynamoDB, el "esquema" para la tabla de fotos podría ser:

Album_Photo

  • ID de álbum (cadena, clave principal)
  • Identificación con foto (número, tecla de rango)
  • ... Otros campos

Ahora, donde escribí Otros campos, podría guardar todos los datos de fotos y guardar otra solicitud para la tabla de datos adecuada, pero esto crearía datos redundantes si la foto existe en muchos albunes.

Puede guardar todos los datos de la foto en esta tabla para el álbum "principal", y en los otros albuns usar una columna para especificar es la ID del álbum principal. Como los datos de NoSQL no necesitan un esquema estricto, no es necesaria una columna en una tabla.

Si el ID de foto tiene de alguna manera un comportamiento de incremento automático, puede obtener fácilmente las últimas X imágenes de un álbum. de lo contrario, podría usar la fecha como clave de rango y la identificación con foto como columna. También es una buena idea usar la tecla de rango invertida, para consultar la última fila fácilmente.

Estoy buscando construir una estructura de datos apropiada para el almacenamiento NoSQL de una galería de fotos. En mi aplicación web, una foto puede ser parte de 1 o más álbumes. Tengo experiencia con MySQL, pero casi ninguno con almacenamiento de clave-valor.

Con MySQL, habría configurado (3) tablas de la siguiente manera:

photos (photo_id, title, date_uploaded, filename) albums (album_id, title, photo_id) album_photo_map (photo_id, album_id)

Y luego, para recuperar una lista de las últimas 5 fotos (con datos del álbum), una consulta como esta:

SELECT * FROM albums, photos, album_photo_map WHERE albums.album_id = album_photo_map.album_id AND photos.photo_id = album_photo_map.photo_id ORDER BY photos.date_uploaded DESC LIMIT 5;

¿Cómo puedo lograr una consulta similar usando una base de datos de pares clave-valor NoSQL? (Específicamente, DynamoDB de Amazon.) ¿Cómo se vería el almacenamiento? ¿Cómo funcionaría la indexación?


Usando mongodb lingo, sus colecciones podrían verse así:

photos = [ { _id: ObjectId(...), title: "...", date_uploaded: Date(...), albums: [ ObjectId(...), ... ] }, ... ] albums = [ { _id: ObjectId(...), title: "..." } ]

Encontrar las 5 fotos más nuevas se haría así:

> var latest = db.photos.find({}).sort({date_uploaded:1}).limit(5);

No hay uniones en el servidor en mongo, por lo que tendrías que buscar todos los últimos álbumes como este:

> var latest_albums = latest.find({}, {albums: 1});

Por supuesto, entonces tienes que reducir esto a un conjunto.

De hecho, es más fácil si insertas el álbum dentro de los documentos de la foto, ya que son pequeños:

photos = [ { _id: ObjectId(...), title: "...", date_uploaded: Date(...), albums: [ {name: "family-vacation-2011", title: "My family vacation in 2010"}, ... ] }, ... ]

Luego, consultar es lo mismo, pero no es necesario que te unas. Encontrar todas las fotos en un álbum se ve así:

> db.photos.find({albums:{$elemMatch:{name: "family-vacation-2011"}}});


Redis puede manejar esto. Para la tabla de RMDBS que mencionaste anteriormente:

SET fotos: photo_id: título "algunas palabras del título de las fotos"
SET fotos: photo_id: date_uploaded "algún tiempo cargado (2011-02-09 HH: MM: SS por ejemplo)"
SET fotos: photo_id: nombre de archivo "algunas palabras de nombre de archivo"

SET albums: album_id: título "algunas palabras del título del álbum"

SADD album_photo_map: photo_id album_id

Use una Lista (lista de suscripciones Redis) para almacenar las últimas fotos cargadas y actualice la lista cuando se cargue una nueva foto:

ret = r.lpush ("upload: last_upload_times", photo_id) // lista de actualización
ret = r.ltrim ("upload: last_upload_times", 0, N-1) // longitud de la lista de control

luego, si queremos obtener las últimas N fotos cargadas con datos del álbum:

last_uploaded_photo_list = r.lrange ("upload: last_upload_times", 0, N-1) last_uploaded_photo_with_album_list = [(photo_id, album_id) para photo_id en last_uploaded_photo_list para album_id en r.smembers (photo_id)]