Richtiges NoSQL Datenschema für Web-Fotogalerie

Ich bin auf der Suche nach einer geeigneten Datenstruktur für NoSQL Speicher einer Fotogalerie zu bauen. In meiner Web-Anwendung kann ein Foto Teil von 1 oder mehr Alben sein. Ich habe Erfahrung mit MySQL, aber fast keine mit Key-Value-Speicherung.

Mit MySQL hätte ich (3) Tabellen wie folgt eingerichtet:

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

Und dann, um eine Liste der 5 neuesten Fotos (mit Album-Daten), eine Abfrage wie folgt abzurufen:

 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; 

Wie würde ich eine ähnliche Abfrage mit einer NoSQL Key-Value-Paar-Datenbank erreichen? (Speziell Amazon's DynamoDB.) Wie würde der Speicher aussehen? Wie würde die Indizierung funktionieren?

3 Solutions collect form web for “Richtiges NoSQL Datenschema für Web-Fotogalerie”

Mit mongodb lingo können deine Kollektionen so aussehen:

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

Das Finden der 5 neuesten Fotos würde so gemacht werden:

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

Es gibt keine Server-Side-Joins im Mongo, also musst du alle neuesten Alben wie folgt abrufen:

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

Natürlich musst du das in einen Satz kochen.

Es ist eigentlich einfacher, wenn man das Album nur in die Fotodokumente einbindet, da sie klein sind:

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

Dann ist die Abfrage gleich, aber du musst nicht mitmachen. Das Finden aller Fotos in einem Album sieht aus wie:

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

Redis kann damit umgehen. Für die RMDBS-Tabelle, die Sie oben erwähnt haben:

SET Fotos: photo_id: Titel "einige Fotos Titelwörter"
SET Fotos: photo_id: date_uploaded "einige hochgeladene Zeit (2011-02-09 HH: MM: SS zum Beispiel)"
SET Fotos: photo_id: Dateiname "einige Dateinamenwörter"

SET Alben: album_id: title "einige Albumtitelwörter"

SADD album_photo_map: photo_id album_id

Verwenden Sie eine Liste (Redis suports list), um die zuletzt hochgeladenen Fotos zu speichern und die Liste zu aktualisieren, wenn ein neues Foto hochgeladen wird:

Ret = r.lpush ("upload: last_upload_times", photo_id) // Updateliste
Ret = r.ltrim ("upload: last_upload_times", 0, N-1) // Kontrolllistenlänge

Dann, wenn wir die letzten hochgeladenen N Fotos mit Albumdaten bekommen wollen:

Last_uploaded_photo_list = r.lrange ("upload: last_upload_times", 0, N-1) last_uploaded_photo_with_album_list = [(photo_id, album_id) für photo_id in last_uploaded_photo_list für album_id in r.smembers (photo_id)]

Mit DynamoDB könnte das "Schema" für die Fotos-Tabelle sein:

Album_Foto

  • Album-ID (String, Primärschlüssel)
  • Foto-ID (Nummer, Bereichstaste)
  • … Andere Felder

Nun, wo ich andere Felder geschrieben habe, könntest du alle Fotodaten speichern und eine andere Anforderung für die richtige Datentabelle speichern, aber das würde redundante Daten erzeugen, wenn das Foto in vielen albuns existiert.

Sie können alle Fotodaten in dieser Tabelle für das "Haupt" Album speichern und in den anderen Albuns eine Spalte verwenden, um die Hauptalbum-ID anzugeben. Da NoSQL-Datenbanken kein strenges Schema benötigen, ist keine Spalte in einer Tabelle erforderlich.

Wenn photoID irgendwie ein Auto-Inkrement-Verhalten hat, kannst du ganz einfach die letzten X-Bilder eines Albums bekommen. Wenn nicht, können Sie das Datum als Range Key und Foto-ID als Spalte verwenden. Ist auch eine gute Idee, dass Ihr Bereich Schlüssel umgekehrt, um die letzte Zeile leicht abzufragen.

  • Ermittlung der Ausführungszeit von Abfragen in SQLite
  • Filtern eines Pyspark DataFrame mit SQL-like IN-Klausel
  • VALUES-Klausel in SQLAlchemie
  • Konvertieren von LEFT OUTER JOIN Abfrage zu Django orm queryset / query
  • So verwenden Sie komplexe SQL-Skripte mit Python
  • Erzeugen Sie neue Dataframe mit Werten in alten Dataframe als neue Funktionen in Python
  • Wie exportiere ich ein Table-Dataframe in pyspark zu csv?
  • UWSGI tötet Arbeiter zu schnell
  • Lesen Sie bestimmte Spalten in csv mit Python
  • Wie kann ich mehrere Tabellen gleichzeitig abfragen?
  • Abrufen von Daten aus SQL mit pyodbc
  • Python ist die beste Programmiersprache der Welt.