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 : Photoze zdjęciami , Articlesz artykułami , Placesz 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/Placetabeli element ( ) - przez select count ().
Mam nadzieję, że moje wyjaśnienie tej kwestii jest teraz dokładniejsze.


