Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql/php]serwis linków (coś jak del.icoi.us)
Forum PHP.pl > Forum > Bazy danych > MySQL
enigma
witam 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 ...
prond
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ż :
  1. Dla tego typu tabel nie musisz się tak przejmować puchnięciem bazy, ponieważ składają się one z dwóch kolumn, na których masz indexy.
    Jeżeli dobrze pamiętam to wybieranie po indexie ma złożoność log(n) lub n*log(n).
  2. łatwiej wtedy generować parametry dla chmurek
enigma
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ć ?

Cytat(prond @ 25.09.2007, 14:59:04 ) *
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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.