Ich baue eine Website auf, die Yelp ähnelt (Recommendation Engine, allerdings in kleinerem Maßstab), daher wird es drei Hauptkomponenten im System geben: Benutzer, Ort (einschließlich Unternehmen) und Ereignis.
Nun frage ich mich, wie man Informationen wie Fotos, Kommentare und "Komplimente" (ähnlich wie Facebooks "Gefällt mir") für jede dieser Arten von Entitäten und auch für jedes Objekt, auf das sie angewendet werden können (z. B. Kommentar zu einer Empfehlung, Foto usw.) speichern kann. Bisher hatte ich für jedes Objekt eine eigene Tabelle, d. h.
Foto (id, Typ , Eigentümer_id , is_main, etc...)
wobei Typ für steht: 1=Benutzer, 2=Ort, 3=EreignisKommentar (id, object_type, object_id , user_id, Inhalt, etc, etc...)
wobei object_type für verschiedene Objekte wie Fotos, Empfehlungen usw. stehen kannKompliment ( objekt_id , Objekt_Typ , compliment_type, user_id)
wobei object_type für verschiedene Objekte wie Fotos, Empfehlungen usw. stehen kannAktivität (id, Quelle, Quelle_Typ , source_id , etc..)
//for "activity feed"
wobei source_type ein Benutzer, ein Ort oder ein Ereignis istBenachrichtigung (id, Empfänger, Absender, activity_type, Objekt_Typ , objekt_id , etc...)
wobei object_type & object_id verwendet werden, um einen direkten Link zum Objekt der Benachrichtigung zu erstellen, z. B. das Foto eines Nutzers, der ein Kompliment erhalten hat
Aber nach Lesen ein paar Beiträge Bei SO wurde mir klar, dass ich die referentielle Integrität nicht mit einem Fremdschlüssel aufrechterhalten kann, da dies eine 1:1-Beziehung erfordert und meine Felder source_id/object_id sich auf eine ID in mehr als einer Tabelle beziehen können. Also entschied ich mich für die Methode, die Hauptentität beizubehalten, sie aber in Teilmengen aufzuteilen, d. h.
Benutzerfoto (photo_id, user_id) | Ortsfoto (photo_id, place_id) | etc...
Photo_Comment (comment_id, photo_id) | Recommendation_Comment(comment_id, rec_id) | etc...
Kompliment (id, ...)
//would need to add a surrogate key to Compliment table now
Foto_Kompliment(compliment_id, photo_id) | Kommentar_Kompliment(compliment_id, comment_id) | usw...
User_Activity(activity_id, user_id) | Place_Activity(activity_id, place_id) | etc...
Ich dachte, ich könnte einfach Ansichten erstellen, die jede Untertabelle mit der Haupttabelle verbinden, um die gewünschten Ergebnisse zu erhalten. Außerdem denke ich, es würde auch in meine Objektmodelle in Code Igniter passen.
Die einzige Tabelle, von der ich denke, dass ich sie stehen lassen könnte, ist die Tabelle mit den Benachrichtigungen, da es viele Objekttypen gibt (Forenbeitrag, Foto, Empfehlung usw.), und diese Tabelle enthält die Benachrichtigungen ohnehin nur für eine Woche, so dass etwaige Probleme mit der Integrität von Referenzen kein großes Problem darstellen sollten (denke ich).
Gehe ich also auf eine vernünftige Art und Weise vor? Gibt es Probleme mit der Leistung, der Zuverlässigkeit oder andere Probleme, die ich vielleicht übersehen habe?
Das einzige "Problem", das ich sehe, ist, dass ich am Ende eine Menge Tische haben würde (im Moment habe ich etwa 72, also schätze ich, dass ich am Ende etwas weniger als 90 Tische haben würde, wenn ich die Extras hinzufüge), und das ist kein Problem, soweit ich das beurteilen kann.
Für jede Art von Feedback bin ich sehr dankbar. Vielen Dank im Voraus.
EDITAR : Nur um das klarzustellen, ich mache mir keine Sorgen, wenn ich am Ende 10 oder so Tische mehr habe. Von dem, was ich weiß, die Anzahl der Tabellen ist nicht zu viel von einem Problem (sobald sie verwendet werden)... es sei denn, Sie hatten sagen 200 oder so :/