Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Cotygodniowa wysyłka ofert
zelu
post
Post #1





Grupa: Zarejestrowani
Postów: 229
Pomógł: 34
Dołączył: 7.12.2008
Skąd: Poznań

Ostrzeżenie: (0%)
-----


Witam,

mam problem natury algorytmicznej. Piszę aktualnie skrypt, w którym użytkownicy się zapisać do poszczególnych kanałów, a w tych z kolei pojawiają się co jakiś czas systemowe wiadomości. Wiadomości wyświetlają się w sidebarze, ale przy dopisaniu się do kanału można wybrać również opcję wysyłania wiadomości mailem. Dostępne są możliwości wysyłki natychmiastowej, raportu raz w tygodniu, albo brak e-maili. Nie ma problemu z wysyłką natychmiastową i brakiem e-maili. Zaciąłem się jednak przy wysyłce maili raz na tydzień.
Jak wiadomo różni użytkownicy mogą się zapisać do różnych kanałów, a więc każdy dostanie inne wiadomości w swoim mailu. Moje pytanie więc, jak pobrać te dane z bazy? Schemat jest następujący:

user:
- id
- email

channel
- id
- name

message:
- id
- title
- content
- channel_id

channel_user:
- id
- channel_id
- user_id

Można oczywiście pobrać najpierw użytkowników, a później dla każdego usera w pętli for pobrać odpowiednie wiadomości. Nie chciałbym jednak robić tego w ten sposób. Macie może jakieś inne pomysły?


Pozdrawiam
Marcin
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
thek
post
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Tak... Struktura rekordów otrzymanych z bazy jest identyczna z podaną przez Ciebie. Kontroluję tylko tak zmienia się user i kategoria (prosty if) i w zależności od sytuacji odpowiednio reaguję strukturą danych dokładając gałęzie w odpowiednich miejscach. Można to zrobić jeszcze ciut inaczej. Ale to już optymalizacja (IMG:style_emoticons/default/smile.gif) Interesuję się nie całą wiadomością, ale tylko jej id. W Twoim wypadku Całość zakończyła by się na... id kanału. Dane kanału są zapewne wspólne dla wszystkich userów, a więc wiadomości z tego samego kanału są identyczne dla wszystkich, co pozwala sobie je na boku stworzyć na podstawie zapamiętanych id kanałów. Miałbyś wtedy strukturę danych z bazy user - kanał oraz kanał - wiadomości. To skok wydajnościowy pewien, gdyż pozbywasz się nie tylko JOIN z zapytania na rzecz prostszych dwóch zapytań, ale i upraszczasz dane z racji tego, że powtarzające się informacje o wiadomościach przechowujesz jako osobna strukturę. Masz więc ostatecznie coś takiego:
array( user1 => array( email, informacje => array( kategoria1, kategoria2 ) ), user2 => array( email, informacje => array( kategoria1 , kategoria3 ) ) )
array( kategoria1 => array(wiadomosc1, wiadomosc2, wiadomosc3), kategoria2 => array(wiadomosc1, wiadomosc2), kategoria3 => array(wiadomosc1) )
W tym przykładzie obaj userzy mają wspólną kategoria1. Zapewne są tam identyczne wiadomości, które byśmy tylko dublowali dla każdego użytkownika. Lepiej je mieć osobno i tylko w razie potrzeby wybierać właściwą kategorię i obrabiać (czytaj wrzucać dane wiadomości (IMG:style_emoticons/default/winksmiley.jpg) ). Oszczędza to nie tylko czas, ale i zasoby - usuwając nadmiarowe dane. A jak to rozwiązać? Podczas pierwszego zapytania prostego o userów i ich kanały wrzucaj je do osobnej tablicy. Potem zrób na niej array_unique by wydobyć unikalne. Teraz zapytanie do bazy o wiadomości w tych kanałach. Dołączenie podczas wysyłki odpowiedniej kategorii wiadomości już jest proste.

EDIT: Wykrywacz i robisz coś, co jest bardzo nieoptymalne, czyli iloczyny kartezjańskie. A struktura jaką podał zelu ma sens. Jest to bowiem relacja wiele-do-wielu. Każdy user może być zapisany do dowolnej liczby kanałów a każdy kanał może mieć wielu subskrybentów. Poza tym skąd wiesz z góry jaka wiadomość do kogo trafi? Użytkownik zapisuje się do kanału, nie do konkretnej wiadomości w nim, co właśnie zrobiłeś. To co Ty podałeś jest właśnie bez sensu. Z góry zgadujesz, która nowa wiadomość do kogo trafi? Po to właśnie wiadomość ma przyporządkowanie do id kanału, by można było określić: "Hej to jest mój kanał i masz mnie w nim szukać". Sprawa nieco się komplikuje, gdy wiadomość jest klasyfikowana do kilku kanałów. Wtedy albo trzeba ją zawrzeć w obu, albo na poziomie tworzenia danych wyłapać takiego "dubla".
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 16:14