Jestem programistą. Uwielbiam kodować, ale nie znoszę baz danych ... Obecnie tworzę stronę internetową, na której użytkownik będzie mógł oznaczyć podmiot jako polubiony (jak na FB), otagować go i skomentować .
Utknąłem na projektowaniu tabel bazy danych do obsługi tej funkcji. Rozwiązanie jest banalne, jeśli możemy to zrobić tylko dla jednego rodzaju rzeczy (np. Zdjęć). Ale muszę to włączyć dla 5 różnych rzeczy (na razie, ale zakładam też, że ta liczba może rosnąć w miarę wzrostu całej usługi).
Znalazłem tutaj kilka podobnych pytań, ale żadne z nich nie ma satysfakcjonującej odpowiedzi, więc zadaję to pytanie ponownie.
Pytanie brzmi, jak prawidłowo, wydajnie i elastycznie zaprojektować bazę danych, aby mogła przechowywać komentarze dla różnych tabel , polubień dla różnych tabel i dla nich tagi . Jakiś wzorzec projektowy jako odpowiedź będzie najlepszy;)
Opis szczegółowy : Mam tabelę User
z danymi użytkownika i jeszcze 3 tabele : Photo
ze zdjęciami , Articles
z artykułami , Places
z miejscami . Chcę umożliwić każdemu zalogowanemu użytkownikowi:
skomentuj dowolną z tych 3 tabel
oznacz dowolne z nich jako lubiane
oznacz dowolne z nich jakimś tagiem
Chcę też policzyć liczbę polubień dla każdego elementu i ile razy ten konkretny tag został użyty.
1 st podejście :
a) W przypadku tagów będę utworzyć tabelę Tag [TagId, tagName, tagCounter]
, a następnie będzie utworzyć wiele do wielu relacje tabel dla: Photo_has_tags
, Place_has_tag
, Article_has_tag
.
b) To samo dotyczy komentarzy.
c) czy utworzyć tablicę LikedPhotos [idUser, idPhoto]
, LikedArticles[idUser, idArticle]
, LikedPlace [idUser, idPlace]
. Liczba polubień będzie obliczana na podstawie zapytań (co, jak zakładam, jest złe). I...
Naprawdę nie podoba mi się ten projekt z ostatniej części, źle pachnie;)
2 II podejście :
Utworzę tabelę, w ElementType [idType, TypeName == some table name]
której administrator (ja) zapełni nazwy tabel, które można polubić , skomentować lub otagować . Następnie utworzę tabele :
a) LikedElement [idLike, idUser, idElementType, idLikedElement]
i to samo dla komentarzy i tagów z odpowiednimi kolumnami dla każdego. Teraz, gdy chcę zrobić zdjęcie polubione, wstawię:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Photo'
INSERT (user id, typeId, photoId)
a dla miejsc:
typeId = SELECT id FROM ElementType WHERE TypeName == 'Place'
INSERT (user id, typeId, placeId)
i tak dalej ... Myślę, że drugie podejście jest lepsze, ale też czuję, że w tym projekcie też czegoś brakuje ...
Wreszcie zastanawiam się, gdzie najlepiej przechowywać licznik, ile razy ten element się podobał. Przychodzą mi do głowy tylko dwa sposoby:
- w
Photo/Article/Place
tabeli element ( ) - przez select count ().
Mam nadzieję, że moje wyjaśnienie tej kwestii jest teraz dokładniejsze.