![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 163 Pomógł: 0 Dołączył: 10.09.2006 Ostrzeżenie: (0%) ![]() ![]() |
witam (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
próbuję zrobić serwis z linkami podobny do del.icio.us (w frameworku symfony), i zastanawiam się jaką bazę danych stworzyć aby serwis działała wydajnie przy dużej liczbie użytkowników. Na początek myślę o 5 tabelach bookmarks id id_link id_user id_tags (tagi adresu, czyli np :1:2:3:4: - to id tagów z tabeli tags) etykieta opis wizyty tags id tag_name visits link id url user id name tags (tagi użytkownika, czyli np :1:2:3:4: - to id tagów z tabeli tags) ogólnie jest tak że wszystkie linki są w tabeli linki żeby nie powielać jak 1000 osób wpisze onet.pl, podobnie z tabelą tags nie wiem czy tak będzie wydajnie, czy może inaczej to zaprojektować ? bo na przykład jak wykonam tag_cloud dla konkretnego użytkownika to trzeba pobrać z tabeli user jego tagi(id), rozdzielić funkcją explode() i wyciągać nazwy z tabeli tags i baza nie rośnie tak szybko. Czy może lepie dodać jeszcze jedną tabelę i w niej każdy tag danego użytkownika przechowywać w osobnym rekordzie i póxniej JOIN'a robić żeby wyciągnąć nazwy tagów Proszę o sugestie ... Ten post edytował enigma 25.09.2007, 20:00:10 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 254 Pomógł: 10 Dołączył: 8.11.2006 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Trochę kiepsko wyglądają te pola tags i id_tags.
Złamanie 1 postaci normalnej przez wrzucanie do jednego pola wielu id niewiele pomaga w kontekście wydajności ponieważ same id to tylko informacja szczątkowa - nie wykorzystasz jej od razu, tylko budując kolejne zapytanie. Moim zdaniem zrób tabele łączące bookmarks_tags i users_tags, tak jak sam wspomniałeś, ponieważ :
|
|
|
![]() ![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 163 Pomógł: 0 Dołączył: 10.09.2006 Ostrzeżenie: (0%) ![]() ![]() |
dołożyłem 2 tabele, user_tags tu będą tagi użytkowników, zamiast komórki w tabeli user gdzie było :tag:tag:tag:
podobnie bookmark_tags gdzie będą linki z przypisanymi tagami zamiast wcześniejszej komórki id_tags gdzie również było :tag:tag:tag: projekt bazy tylko teraz jak będę chciał wyciągnąć dane to będzie mniej zapytań ale za to jeden wielki JOIN no i jak taka baza będzie, czy może jeszcze coś poprawić ? Jeżeli dobrze pamiętam to wybieranie po indexie ma złożoność log(n) lub n*log(n) oczywiście JOIN idzie po ID, tylko że zaleca się tworzenie linków nie zawierających ID, więc trzeba szukać np. po stripped_tag
Ten post edytował enigma 25.09.2007, 19:59:35 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 24.08.2025 - 19:13 |