Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zaawansowany mechanizm wiadomości
Forum PHP.pl > Forum > PHP
koxu1996
Witam. Przede mną stoi ciężkie zadanie, a mianowicie zrobienie dosyć zagmatwanego systemu wiadomości. Najtrudniejszą rzeczą jest zrobienie wiadomości do więcej niż jednej osoby, za pomocą wyboru kryteriów(wiek, płeć itd.)
Może zacznę od tego co mam zrobione:

- pola w tabeli: sender_id, receiver_id, owner, readed, readed_time

- wysyłanie wiadomości: generuje 2 rekordy:
  • sender_id=$nadawca, receiver_id=$odbiorca, owner=0 //nadawca może usunąć wiadomość z wysłanych nie usuwając tym samym z odebranych odbiorcy
  • sender_id=$nadawca, receiver_id=$odbiorca, owner=1 //odbiorca może usuną wiadomość z odebranych nie usuwając tym samym z wysłanych nadawcy
- usuwanie wiadomości: można usunąć wiadomości których jest się właścicielem tj. (sender_id=$id AND owner=0) LUB (receiver_id=$id AND owner=1)

- czytanie wiadomości: jeżeli wiadomość jest nieprzeczytana (readed=0) to aktualizuje czas przeczytania na aktualny (readed_time=NOW())

- pokazywanie liczby nieprzeczytanych wiadomosci bez wchodzenia w zakładke: liczy liczbę wiadomości których jeszcze użytkownik nie przeczytał i są w jego skrzynce odbiorczej (readed=0 AND receiver_id=$id)

###

Wszystko działa sprawnie i tak jak należy, lecz zleceniodawca ostatnio zlecił mi wdrożenie wiadomości do wszystkich. Przemyślałem to i postąpiłem tak:
- Nie mogę dla każdego użytkownika przydzielać rekordu, gdyż dla 1000 użytkowników będzie to 1000 rekordów i bezsensowne kopiowanie tej samej treści. Dlatego też dla wiadomości dla wszystkich generuję taki rekord:
  • sender_id='1' /*id admina*/, receiver_id='0' /*pusty odbiorca*/, owner=2 //przyjąłem że wartość pola 'owner' równa 2 oznacza wiadomość dla każdego

I teraz problemy:
1. W pokazywaniu liczby wiadomości nie ma uwzględnionej wiadomości dla wszystkich, gdyż nie jest zapisywane kto ją przeczytał a kto nie. Myślałem, aby rozwiązać to za pomocą zapisywania najnowszej przeczytanej wiadomości dla wszystkich i wtedy by sobie przeliczało. Wiąże się to z koniecznością NIE usuwania wiadomości dla wszystkich, gdyż zliczanie by się zepsuło, więc trzeba było by wprowadzić pole 'enabled'. Czy jest to dobre rozwiązanie? Ew. jak inaczej to zrobić?
2. Za jakiś czas będę musiał do wysyłania do wszystkich wdrożyć kryteria. Myślałem nad drugą tabelą, choć jeszcze do końca nie wiem w jakiej formie miałbym zapisywać kryteria. Macie jakiś pomysł?

Mam nadzieję że zrozumieliście o co mi chodzi i pomożecie mi z tymi problemami. W razie czegoś proszę pytać, a ja dokładniej wytłumaczę co miałem na myśli.
freemp3
Co do samego mechanizmu wiadomości, wystarczyło dodać dwie kolumny z flagami statusu wiadomości dla odbiorcy i nadwacy, w tedy byś zmieścił je w jednym rekordzie. Przy usuwaniu po prostu zmieniasz status. Jeśli oba statusy informują, że wiadomość została usunięta to usuwasz rekord i po sprawie.

Co do samego mechanizmu na Twoim miejscu wysyłał bym wiadomości na takiej samej zasadzie jak teraz. Dodanie wpisu dla admina jest zbędne.

Dodanie dodatkowej tabeli może i zaoszczędzi wpisów, ale tylko pozornie. Musisz gdzieś trzymać identyfikatory, użytkowników, którzy przeczytali bądź nie przeczytali wiadomości. Po drugie, jeśli usuniesz wiadomość z panelu admina (zakładam, że jest taka możliwość) - użytkownik później już jej nie odczyta.
koxu1996
Cytat(freemp3 @ 14.10.2013, 09:29:32 ) *
Co do samego mechanizmu wiadomości, wystarczyło dodać dwie kolumny z flagami statusu wiadomości dla odbiorcy i nadwacy, w tedy byś zmieścił je w jednym rekordzie. Przy usuwaniu po prostu zmieniasz status. Jeśli oba statusy informują, że wiadomość została usunięta to usuwasz rekord i po sprawie.

Co do samego mechanizmu na Twoim miejscu wysyłał bym wiadomości na takiej samej zasadzie jak teraz. Dodanie wpisu dla admina jest zbędne.

Dodanie dodatkowej tabeli może i zaoszczędzi wpisów, ale tylko pozornie. Musisz gdzieś trzymać identyfikatory, użytkowników, którzy przeczytali bądź nie przeczytali wiadomości. Po drugie, jeśli usuniesz wiadomość z panelu admina (zakładam, że jest taka możliwość) - użytkownik później już jej nie odczyta.


Co do tych flag to się zgodzę, ale tyczy się to tylko wiadomości miedzy użytkownikami, a ja mam problem z wiadomościami do wszystkich. Chyba nie zrozumiałeś do końca bo ostatni akapit, to nie to o czym myślisz. Dodatkowa tabela ma zawierać tylko wiadomości do wszystkich z kryteriami wyświetlania, a co do usuwania to już pisałem o polu 'disabled'.
freemp3
Napisałem, że kolumny z flagami dotyczą mechanizmu wiadomości, nie pisałem nic o wysyłaniu grupowym - taka informacja na przyszłość, gdybyś optymalizował mechanizm.

Może wyraziłem się trochę nie składnie. Według mnie dodawanie kolejnej tabeli z listą wiadomości trochę nie ma sensu, ponieważ:
1. Tak jak pisałeś mechanizm nieprzeczytanych wiadomości nie będzie działał jak należy - brak pokazywania masowych
2. Jak się nie pokaże info o nowej wiadomości proawdopodobnie nikt jej nie przeczyta, chyba że przypadkiem zajrzy do skrzynki
3. Przeszukiwanie dodatkowej tabeli (z wiadomościami masowymi) jest stratą czasu, skoro można to zrobić na jednej tabeli.
4. Można pokazać, że jest nowa wiadomość (masowa), ale później trzeba będzie oznaczyć ją jako przeczytaną - kolejna tabela?

Opisałem Tobie jak bym zrobił to "po mojemu", czyli podczas wysyłania wiadomości pobierane są identyfikatory użytkowników, do których ma dotrzeć Następnie w tabeli z wiadomościami dodawany jest dla nich wpis. Wystarczt tylko jeden - dla użytkownika, jak odbiorcy. Drugi wpis dla nadawcy - admina, jest zbędny.
Może nie jest to dobre rozwiązanie, nie wiem, nie robiłem nigdy czegoś takiego. Współpracowałem przy projekcie, gdzie coś takiego było użyte, więc chyba nie jest to aż taki zły pomysł.
koxu1996
Dobry pomysł z tymi flagami, tak przerobię system.

Po twojemu dla każdej osoby będzie przydzielony rekord.
Ad.1,2,4 Zapisywanie id ostatniej przeczytanej wiadomości w userze i dalej już można przeliczyć
Ad.3 W pierwszej tabeli nie dam rady wstawić kryteriów, dlatego też by przydała się druga tabela.

Dodatkowo moje rozwiązanie zapewnia że nawet nowy użytkownik zobaczy wiadomości od admina która była pisana przed jego rejestracją. Tylko nie wiem za bardzo jak rozwiązać zapisywanie kryteriów w bazie i tu potrzebowałbym pomysłów.
freemp3
Po co chcesz wstawiać kryteria? Podczas tworzenia wiadomości wybierasz kryteria na podstawie których wczytasz liste identyfikatorów. Później dla każdego z nich dodajesz rekord w tabeli z wiadomościami. Ot cała filozofia.
Co do nowych użytkowników, możesz napisać trigger, który będzie odpalany przy rejestracji i będzie dodawał na dzień dobry jakieś wiadomości.
Cytat
Zapisywanie id ostatniej przeczytanej wiadomości w userze i dalej już można przeliczyć

Co jeśli użytkownik będzie miał 5 wiadomości, przeczyta pierwszą i czwartą? Druga i trzecia też będą oznaczone jako przeczytane?
koxu1996
Racja smile.gif Nie pomyślałem o tym, dlatego też założyłem ten temat. Jednak będzie musiał dla każdego użytkownika robić rekord, ale nie ma innych opcji. Dzięki za pomoc!
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.