Ich bin ein Softwareentwickler. Ich liebe es zu codieren, aber ich hasse Datenbanken ... Derzeit erstelle ich eine Website, auf der ein Benutzer eine Entität als beliebt markieren kann (wie in FB), sie markieren und kommentieren kann .
Ich stecke beim Entwurf von Datenbanktabellen fest, um diese Funktionalität zu handhaben. Die Lösung ist trivial, wenn wir dies nur für eine Art von Dingen tun können (z. B. Fotos). Aber ich muss dies für 5 verschiedene Dinge aktivieren (für den Moment, aber ich gehe auch davon aus, dass diese Anzahl wachsen kann, wenn der gesamte Service wächst).
Ich habe hier einige ähnliche Fragen gefunden, aber keine hat eine zufriedenstellende Antwort. Deshalb stelle ich diese Frage erneut.
Die Frage ist, wie die Datenbank richtig, effizient und elastisch gestaltet werden kann, damit Kommentare für verschiedene Tabellen , Likes für verschiedene Tabellen und Tags für sie gespeichert werden können. Einige Designmuster als Antwort sind am besten;)
Detaillierte Beschreibung : Ich habe eine Tabelle User
mit einigen Benutzerdaten und 3 weitere Tabellen : Photo
mit Fotos , Articles
mit Artikeln , Places
mit Orten . Ich möchte jedem angemeldeten Benutzer Folgendes aktivieren:
Kommentar zu einer dieser 3 Tabellen
Markieren Sie einen von ihnen als gemocht
Kennzeichnen Sie einen von ihnen mit einem Tag
Ich möchte auch die Anzahl der Likes für jedes Element und die Häufigkeit zählen, mit der dieses bestimmte Tag verwendet wurde.
1 st Ansatz :
a) Für Tags , ich werde eine erstellen Tabelle Tag [TagId, tagName, tagCounter]
, dann werde ich schaffen many-to-many - Beziehungen Tabellen für: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) Gleiches gilt für Kommentare.
c) Ich werde eine erstellen Tabelle LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. Die Anzahl der Likes wird durch Abfragen berechnet (was meiner Meinung nach schlecht ist). Und...
Ich mag dieses Design für den letzten Teil wirklich nicht, es riecht schlecht für mich;)
2 nd Ansatz :
Ich werde eine Tabelle erstellen ElementType [idType, TypeName == some table name]
, die vom Administrator (mir) mit den Namen der Tabellen gefüllt wird , die gemocht , kommentiert oder markiert werden können . Dann werde ich Tabellen erstellen :
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
und dasselbe für Kommentare und Tags mit jeweils den richtigen Spalten. Wenn ich nun ein Foto mögen möchte, füge ich Folgendes ein:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
und für Orte:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
und so weiter ... Ich denke, dass der zweite Ansatz besser ist, aber ich habe auch das Gefühl, dass etwas in diesem Design fehlt ...
Schließlich frage ich mich auch, welcher der beste Ort ist, um die Theke zu speichern, wie oft das Element gemocht wurde. Ich kann mir nur zwei Möglichkeiten vorstellen:
- in der
Photo/Article/Place
Tabelle element ( ) - durch Auswahl von count ().
Ich hoffe, dass meine Erklärung des Problems jetzt gründlicher ist.