Sono uno sviluppatore di software. Adoro programmare, ma odio i database ... Attualmente sto creando un sito Web in cui un utente potrà contrassegnare un'entità come piaciuta (come in FB), contrassegnarla e commentarla .
Rimango bloccato nella progettazione di tabelle di database per gestire questa funzionalità. La soluzione è banale, se possiamo farlo solo per un tipo di cosa (es. Foto). Ma devo abilitarlo per 5 cose diverse (per ora, ma presumo anche che questo numero possa crescere, man mano che l'intero servizio cresce).
Ho trovato alcune domande simili qui, ma nessuna di esse ha una risposta soddisfacente, quindi sto ponendo di nuovo questa domanda.
La domanda è: come progettare correttamente, efficientemente ed elasticamente il database, in modo che possa memorizzare commenti per tabelle diverse , like per tabelle diverse e tag per loro. Alcuni modelli di design come risposta saranno i migliori;)
Descrizione dettagliata : ho una tabella User
con alcuni dati utente e altre 3 tabelle : Photo
con fotografie , Articles
con articoli , Places
con luoghi . Voglio abilitare qualsiasi utente registrato a:
commentare una di quelle 3 tabelle
contrassegnare uno di loro come piace
contrassegnare uno di essi con qualche tag
Voglio anche contare il numero di Mi piace per ogni elemento e il numero di volte in cui quel particolare tag è stato usato.
1 ° metodo :
a) Per i tag , creerò un tavolo Tag [TagId, tagName, tagCounter]
, poi creerò molti-a-molti rapporti tabelle per: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) Lo stesso vale per i commenti.
c) Creerò un tavolo LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. Il numero di Mi piace verrà calcolato dalle query (che, presumo sia negativo). E...
Davvero non mi piace questo disegno per l'ultima parte, ha un cattivo odore per me;)
2 ° approccio :
Creerò una tabella ElementType [idType, TypeName == some table name]
che verrà popolata dall'amministratore (me) con i nomi delle tabelle che possono essere apprezzate , commentate o taggate . Quindi creerò tabelle :
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
e lo stesso per commenti e tag con le colonne appropriate per ciascuno. Ora, quando voglio fare una foto piaciuta inserirò:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
e per i luoghi:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
e così via ... Penso che il secondo approccio sia migliore, ma penso anche che manchi qualcosa in questo design ...
Alla fine, mi chiedo anche quale sia il posto migliore dove riporre un contatore per quante volte è stato apprezzato l'elemento. Mi vengono in mente solo due modi:
- nella
Photo/Article/Place
tabella element ( ) - selezionando count ().
Spero che la mia spiegazione del problema sia ora più approfondita.