Was den Datenbankspeicher betrifft, sollte Ihre Anwendung die Struktur basierend auf der Schnittstelle diktieren, die Sie sowohl dem Benutzer als auch dem Stream präsentieren.
Wenn Sie ein Foto hochladen und die URI nicht auswählen können und keine Hierarchie innerhalb eines Streams vorhanden ist, empfehle ich Ihnen, nur eine ID und eine Stream-ID in Ihrer Haupt-Fototabelle zu speichern.
Sie könnten also zumindest etwas wie
sehen
%Vor%
Aber Sie möchten wahrscheinlich auch eine Beschreibung und andere Informationen, die unabhängig vom Speicher sind.
Die Streams-Tabelle würde alle generischen Informationen über einen Stream enthalten, hätte aber eine polymorphe Assoziation zu einer vom Typ des Streams abhängigen Klasse. So könnten Sie diese Assoziation verwenden, um eine Instanz von S3Stream oder DropBoxStream basierend auf dem tatsächlichen Stream zu erhalten.
Diese Instanz (auch eine ActiveRecord-Ressource) könnte den Zugriffsschlüssel und für Dinge wie Dropbox den Pfad zum Ordner usw. speichern. Darüber hinaus könnte diese Instanz Methoden zum Erstellen eines URIs für Ihr Photo-Objekt bereitstellen.
Wenn eine bestimmte Technologie signierte URIs zwischenspeichern muss, dann kann das S3Stream-Objekt auf ein S3SignedUrl-Modell verweisen, in dem die URIs signiert sind.
Wenn sich herausstellt, dass der signierte URL-Code zwischen DropBox und S3 ähnlich ist, haben Sie vielleicht ein einzelnes SignedUrl-Modell.
Wenn Sie die IOS- und Android-Clients entwickeln, ist es wichtig, dass sie keinen Zugriff auf die Zugriffstoken des Stream-Eigentümers erhalten. Stattdessen müssen Sie alle Signaturen in Ihrer Server-App durchführen. Sie möchten nicht, dass eine Kompromittierung eines Geräts dazu führt, dass das Zugriffstoken offengelegt wird, was zu Abrechnungsproblemen und Datenschutzrisiken führt.
Hoffe, das hilft.