![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 197 Pomógł: 24 Dołączył: 22.11.2010 Ostrzeżenie: (0%) ![]() ![]() |
Nie szukam tu gotowca, generalnie jakoś sobie radzę. Rozważania są raczej teoretyczne, niż praktyczne. Otóż wynajduję koło na nowo i zastanawiam się, jak lepiej ugryźć temat tagowania bloga (IMG:style_emoticons/default/smile.gif)
Bazowo mamy dwie tabele - blog i tagi. Wiadomo, w tagach mamy id_taga i nazwę, ewentualnie jakieś tam inne zmienne. Naturalnie zakładamy, że do każdego bloga można przypisać różną ilość tagów. Rozważam w sumie dwie opcje, łatwiejsza i trudniejsza (IMG:style_emoticons/default/wink.gif) Pierwsza z nich to po prostu dodanie dodatkowego pola do tablicy głównej z blogiem (np. tagi) i podanie tagów po spacji, czy przecinku, potem problem z wyszukaniem po tagu załatwiać warunkiem "tagi zawiera", przy generowaniu rozbijać to przez PHP itp. Druga z nich to dodanie trzeciej tabeli blog_tagi ze strukturą: id_powiazania, blog, tag. Potem każde pojedyncze powiązanie polega na podaniu id bloga i id tagu. Czyli np. jeżeli uznam, że dany wpis ma mieć 5 tagów, to przy pierwszym wariancie w polu będzie: "1 2 4 5 8", a przy drugim wariancie będzie to 5 wierszy w tabeli. Blog nie będzie pewnie bardzo poczytny, więc problemy wydajności nie grają wielkiej roli a rozważania biorą się raczej z chęci rozwoju, blablabla (IMG:style_emoticons/default/smile.gif) mimo wszystko lubię robić coś porządnie i stąd pytanie. Wersja druga wydaje mi się właśnie taką bardziej porządną (IMG:style_emoticons/default/smile.gif) |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Tak, jedyna sluszna to wersja 2
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 197 Pomógł: 24 Dołączył: 22.11.2010 Ostrzeżenie: (0%) ![]() ![]() |
Ok. Jakoś to sobie ogarnąłem od strony backendu.
Mam jednak pewien, nazwijmy to problem z frontendem. Czy da się jednym zapytaniem pobrać z tabeli blog tytuł, treść a także w jakiś sposób pobrać wszystkie powiązane z nim tagi? Pewnie trzeba użyć podzapytania, ale czy da się w ten sposób zwrócić pionową tabelę w jednej kolumnie głównego zapytania? Dla jednego, wyświetlanego artykułu to nie jest problem, zrobić dwa zapytania a nie jedno i przeparsować listę przypisanych tagów przez PHP dla ładnego kodu z linkami do danego tagu. Ale przy liście artykułów, którą dostaję z jednego zapytania, gdybym chciał dostać dla każdego z nich listę przypisanych tagów, liczba zapytań katastrofalnie rośnie. jest więc pewnie jakiś myk, na połączenie tabel. Podpowiedź? |
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
zwykly LEFT JOIN na tabele z tagami a nie zadne podzapytanie
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 197 Pomógł: 24 Dołączył: 22.11.2010 Ostrzeżenie: (0%) ![]() ![]() |
Przepraszam, pewnie to głupie pytanie, ale jakoś sobie tego nie mogę wyobrazić. Jeden blog = jeden wiersz w tabeli z blogiem. Natomiast zestaw tagów dla jednego bloga to tyle wierszy ile tagów.
Przecież tabela, w której wylistowane są powiązania tagów, dla jednego bloga ma kilka wierszy - chyba że to ma tak zadziałać. Tylko tyle, że wtedy jeśli jeden blog ma 4 tagi, dostanę 4 zdublowane wiersze - to ma tak działać? Jest to jakieś wyjście, ale wtedy muszę przez PHP odfiltrować duble. |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 374 Pomógł: 79 Dołączył: 6.04.2010 Skąd: Ostrów Wielkopolski Ostrzeżenie: (0%) ![]() ![]() |
Wersja druga wydaje mi się właśnie taką bardziej porządną (IMG:style_emoticons/default/smile.gif) Zdecydowanie tak. Uzasadnienie: normalizacja bazy danych + prędkość kilka rzędów większa niż w przypadku rozwiązania 1. Przepraszam, pewnie to głupie pytanie, ale jakoś sobie tego nie mogę wyobrazić. Jeden blog = jeden wiersz w tabeli z blogiem. Natomiast zestaw tagów dla jednego bloga to tyle wierszy ile tagów. Przecież tabela, w której wylistowane są powiązania tagów, dla jednego bloga ma kilka wierszy - chyba że to ma tak zadziałać. Tylko tyle, że wtedy jeśli jeden blog ma 4 tagi, dostanę 4 zdublowane wiersze - to ma tak działać? Jest to jakieś wyjście, ale wtedy muszę przez PHP odfiltrować duble. Zależy jaki efekt i dane chcesz uzyskać. Jeśli tylko nazwy tagów to dobrą metodą jest zgrupowanie wyniku klauzulą GROUP BY i wykorzystanie funkcji agregującej GROUP_CONCAT: ...a następnie rozbijanie wartości z kolumny "tagi" w PHP, z explode(). Tak jak Ty kombinujesz też jest dobrze (może nawet lepiej), bo masz możliwość uzyskania pełnego zestawu informacji o tagach (identyfikatora, nazwy, komentarza, itd) i wykorzystania tego w widoku np. do skomponowania ładnego linku (z komentarzem w tooltipie) do listy blogów z danym tagiem. Odfiltrowanie wielokrotnych wartości to też żaden problem bo w jednym przejściu po wyniku zapytania to zrobisz. Metoda zależy od zamierzonej funkcjonalności. |
|
|
![]()
Post
#7
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat Tylko tyle, że wtedy jeśli jeden blog ma 4 tagi, dostanę 4 zdublowane wiersze - to ma tak działać? Jest to jakieś wyjście, ale wtedy muszę przez PHP odfiltrować duble. http://nospor.pl/grupowanie-wynikow.html |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 11.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Ja bym to zrobił jeszcze inaczej, zamiast jednej tabli dodaj dwie
1. blog_tagi ze strukturą: id_tagu, tag. 2. tagi_relacja struktura: id_tagu, id_artykułu. |
|
|
![]()
Post
#9
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
bambam a niby o czym my tu przez caly czas mowimy?
|
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 8 Pomógł: 0 Dołączył: 11.04.2012 Ostrzeżenie: (0%) ![]() ![]() |
Druga z nich to dodanie trzeciej tabeli blog_tagi ze strukturą: id_powiazania, blog, tag. Potem każde pojedyncze powiązanie polega na podaniu id bloga i id tagu. Czyli np. jeżeli uznam, że dany wpis ma mieć 5 tagów, to przy pierwszym wariancie w polu będzie: "1 2 4 5 8", a przy drugim wariancie będzie to 5 wierszy w tabeli. nie potrzebuje trzech kolumnw tabeli blog_tagi przy drugiej wersji ma 5 wierszy w relacjach i 5 w blog_tagi widze, że wy rozumiecie (po zapytaniu), tylko nie wiem czy autor załapał Ten post edytował baambaam 31.12.2013, 15:12:45 |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 197 Pomógł: 24 Dołączył: 22.11.2010 Ostrzeżenie: (0%) ![]() ![]() |
Faktycznie trzecia kolumna nie jest jakoś szczególnie potrzebna, w sumie to taki nawyk, że zawsze robię kolumnę z unikalnym ID - którejś mądrej książce o mysql tak zalecali :]
Zabieram się za lekturę podanych linków i sposobów. Post bostafa idealnie się sprawdził. Dzięki wielkie. Nie znałem tej bardzo przydatnej funkcji. Co do porady nospora to faktycznie zwykłe dołączenie tabeli z powiązaniami wystarczy, żeby mieć listę tagów ze zdublowanymi danymi. Skorzystam jednak od razu z grupowania zaproponowanego przez bostafa (IMG:style_emoticons/default/smile.gif) Dzięki za pomoc. Można zamknąć. Ten post edytował maviozo 31.12.2013, 17:42:24 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 23.08.2025 - 12:43 |