Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> algorytm, rozwiazanie, komunikacja użytkowników, poczta
AxZx
post 31.07.2008, 22:01:08
Post #1





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


witam

chciałbym poznać Wasz sposób na system komunikacji użytkowników w serwisach społecznościowych.

co jest potrzebne:
- wysyłanie, odbieranie poczty
- możliwość usuwania poczty, przenoszenia do kosza
- możliwość przeglądania poczty odebranej, wysłanej i tej w koszu

w zasadzie to tyle 'kłopotliwych' kwestii.
ja zrobiłem tabele poczta i pogubiłem się podczas programowania. czy nie prościej byłoby zrobić 2 tabele: odebrane i wysłane?

podzielcie się swoimi rozwiązaniami.

pozdrawiam


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
kwiateusz
post 31.07.2008, 22:06:07
Post #2


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




a nie prosciej dac pole okreslajace czy wiadomosc jest w inbox, sent czy trash?
Go to the top of the page
+Quote Post
AxZx
post 31.07.2008, 22:10:40
Post #3





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


no prosciej, ale prosze o bardziej wyczerpujaca odpowiedz:)
mam kolumne kosz, mam kolumne przeczytane.
ale przeciez u nadawcy moze byc ona w koszu a u odbiorcy juz nie koniecznie:)
a to przeciez ten sam wiersz jest.
wiec musza byc 2 kolumny z typem wiadomosci - tzn z miejscem skladowania.
ale musi tez byc mozliwosc calkowitego usuniecia - nawet z kosza.
jak odbiorca usunie ta wiadomosc na stale to u nadawcy nie koniecznie musi byc ona usunieta:)

wiec dlatego pomyslalem o dwoch tabelach - tak jak jest w normalnej poczcie.
odbiorca i nadawca ma ja na serwerze, lub sobie ja usuwa nie wplywajac na konto pocztowe drugiej strony.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
tiraeth
post 31.07.2008, 22:23:11
Post #4





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

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


Kod
id | sender | receiver | ... | status
---+--------+----------+-----+----------
1  |    321 |      123 | ... | unreaded
2  |    321 |      123 | ... | deleted
3  |    321 |      123 | ... | readed
4  |    123 |      321 | ... | readed


Inbox for "123":
  - ID:1, STATUS:unreaded
  - ID:3, STATUS:readed
  
Trash for "123":
  - ID:2, STATUS:deleted

Sent for "123":
  - ID:4, STATUS:received, RESPONSE_TO:3

Inbox for "321":
  - ID:4, STATUS:readed, RESPONSE_TO:3
  
Sent for "321":
  - ID:1, STATUS:received and unreaded
  - ID:2, STATUS:received
  - ID:3, STATUS:readed and responded (ID:4)


Ja bym zrobił to tak smile.gif

Ten post edytował tiraeth 31.07.2008, 22:23:25
Go to the top of the page
+Quote Post
AxZx
post 31.07.2008, 23:51:10
Post #5





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


troche nie rozumiem tego twojego zapisu.
dodam ze pisze aplikacje na symfony - pierwszy raz mam do czynienia z tym FW i dla mnie to jest bardzo zamieszane.

bo zalozmy sytuacje ze jest 1 tabela no i kolumny z ID odbiorcy nadawcy, jakies flagi czy przeczytane, w ktorym folderze u kogo sie znajduje (folder_odbiorcy, folder_nadawcy) no i user przeglada tylko te z kosza. w koszu sa chyba listy odebrane i wyslane. wiec trzeba zrobic joina do profilu nadawcy i do profilu odbiorcy.

takze to tez jest warunek - zeby mozna bylo prosto napisac aplikacje w symfony:)


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
tiraeth
post 1.08.2008, 00:18:18
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 789
Pomógł: 41
Dołączył: 30.10.2003
Skąd: Wrocław

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


Moje rozwiązanie może Ci nie pasować - owszem. Wyjaśnię tylko, dlaczego możliwość usuwania wysłania wiadomości jest rzeczą zbędną. Ja uważam, że to użytkownik otrzymujący wiadomość powinien mieć pełne uprawnienia. Gdy "usunie do Trash" wiadomość, jej status zmieni się na deleted. Gdy usunie ją z Trasha, zmieni się na hidden. Fizycznie wiadomości nie usuwamy, bo musi pozostać ona w "Sent" naszego użytkownika-nadawcy.

Widzę, że próbujesz na siłę zaimplementować funkcjonalność SMTP/IMAP w prostą (z założenia potrzeb) aplikację prywatnych wiadomości. Jeśli o to Ci chodzi, to może z automatu zakładaj skrzynki mailowe z virtuaboxami na sql, stwórz webmaila i ogranicz możliwość wysyłania i odbierania wiadomości do adresatów z Twojej domeny. I voila smile.gif Będzie to o tyle lepsze rozwiązanie niż tradycyjne PW, że delikwent będzie mógł pobrać wiadomości (zostawiając kopię - ustawienia serwera, nie klienta) na komputer korzystając z np. Outlooka i przeglądać je nawet gdy serwis będzie offline. Oczywiście prosto z Outlooka będzie mógł odpisać lub napisać nową wiadomość smile.gif Czyli taki "intramail" globalnie winksmiley.jpg
Go to the top of the page
+Quote Post
AxZx
post 1.08.2008, 00:40:16
Post #7





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


ale czy konieczne jest trzymanie zbednych wiadomosci? jak obydwie strony ja usuna to po co mi ona ma miejsce w bazie zajmowac?
ale czy dobrze rozumuje z tymi dwoma kolumnami?
bo jak nadawca zmieni status deleted to nie koniecznie musi oznaczac ze odbiorca tez ma ja miec w koszu.
wiec chyba to jest jedyna droga?


Cytat
Widzę, że próbujesz na siłę zaimplementować funkcjonalność SMTP/IMAP

tez o takim czyms myslalem. ale z drugiej strony informacja na maila o nowej poczcie jest motywacja zeby wejsc na strone i przy okazji cos tam poogladac, kliknac reklame:)

takze to bym zrobil w ramach pracy dyplomowej ale juz magisterskiej:) jak zdaze oczywiscie.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
Moli
post 1.08.2008, 08:05:48
Post #8





Grupa: Zarejestrowani
Postów: 662
Pomógł: 45
Dołączył: 26.03.2007
Skąd: Warszawa

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


Akurat teraz pisałem prywatne wiadomości i ja zrobiłem to na jednej tabeli. Tabela wygląda w skrócie tak:
Kod
ID | OD_ID | DO_ID | KATALOG | TYTUŁ ITP...

I w katalogu wysłane, sprawdzam po prostu nie od kogo jest wiadomość a do kogo smile.gif Tak naprawdę cały mechanizm to pobranie danych, przenoszenie i kasowanie wiadomości + kilka ifów żeby w folderze wysłane nie wyświetlało się "Od" tylko "Do" smile.gif
Go to the top of the page
+Quote Post
AxZx
post 1.08.2008, 08:56:01
Post #9





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


daj linka do testow:) bo cos za latwo to opisujesz.


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
.radex
post 1.08.2008, 09:03:02
Post #10





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


A nie można po prostu

id | sender | receiver | ... | status_sender | status_receiver

To jest chyba najprostsze rozwiązanie. Wysyłający i otrzymujący mają osobną kolumnę na status (kolumny typu ENUM). I tyle.


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
Sedziwoj
post 1.08.2008, 09:29:27
Post #11





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Cytat(AxZx @ 1.08.2008, 01:40:16 ) *
ale czy konieczne jest trzymanie zbędnych wiadomości? jak obydwie strony ja usuną, to po co mi ona ma miejsce w bazie zajmować?


Takie rzeczy lepiej przechowywać, bo mogą się potem przydać w razie jakiś kłopotów.
Ludzie wysyłają dziwne wiadomości i lepiej je zawsze mieć.

EDIT: zresztą jak się nie mylę to tak robią większe portale społecznościowe, a na pewno mają jakiś cel w tym.

Ten post edytował Sedziwoj 1.08.2008, 09:30:37


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
athabus
post 1.08.2008, 09:39:11
Post #12





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Zrób tak jak radex_p radzi - to jest imho najlepsze rozwiązanie. Dodatkowo weź pod uwagę co pisze Sedziwoj bo faktycznie, lepiej przez jakiś czas przechowywać takie wiadomości "na zapas", nawet jeśli odbiorca i nadawca tą wiadomość usuną.
Według mnie tu zastosowanie znajdzie cron - poprostu napisz prosty skrytp, który raz dziennie uruchomisz z crona, który usunie wszystkie wiadomości oznaczone przez obu userów jako "usunięte" i starsze niż x dni.
Go to the top of the page
+Quote Post
AxZx
post 1.08.2008, 10:02:19
Post #13





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


to rozwiazanie tez wydaje mi sie najrozsadniejsze -w teorii:)
ale teraz to trzeba napisac w symfony:P
dlatego pisalem o czyms bardziej przejrzystym tak zeby jasniej to bylo napisane (kod).


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
legorek
post 1.08.2008, 12:09:53
Post #14





Grupa: Zarejestrowani
Postów: 411
Pomógł: 35
Dołączył: 27.06.2004
Skąd: Kraków

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


Cytat(radex_p @ 1.08.2008, 08:03:02 ) *
A nie można po prostu

id | sender | receiver | ... | status_sender | status_receiver

To jest chyba najprostsze rozwiązanie. Wysyłający i otrzymujący mają osobną kolumnę na status (kolumny typu ENUM). I tyle.


Pole powinno być raczej typu SET, ponieważ wiadomość określona jest dwoma parametrami
położenie: otrzymane, wysłane, kosz
status: przeczytana, nieprzeczytana
z których można stworzyć różne kombinacje:
np: mogę przenieść nieprzeczytaną wiadomość do kosza, ale chciałbym zachować informację, że jest nieprzeczytana smile.gif


--------------------
Go to the top of the page
+Quote Post
AxZx
post 1.08.2008, 13:15:36
Post #15





Grupa: Zarejestrowani
Postów: 1 385
Pomógł: 55
Dołączył: 1.03.2005
Skąd: śląsk

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


jaki typ kolumn to juz mniej istotna kwestia.

ustalilismy juz jak ma wygladac tabela
podsumowujac:
  1. CREATE TABLE `poczta` (
  2. `idpoczta` int(11) NOT NULL AUTO_INCREMENT,
  3. `temat` varchar(60) DEFAULT NULL,
  4. `tresc` text,
  5. `idprofil_nadawca` int(11) NOT NULL,
  6. `idprofil_odbiorca` int(11) NOT NULL,
  7. `przeczytane` tinyint(2) UNSIGNED DEFAULT '0',
  8. `status_nadawca` tinyint(2) UNSIGNED DEFAULT '0',
  9. `status_odbiorca` tinyint(2) UNSIGNED DEFAULT '0',
  10. `created_at` datetime DEFAULT NULL,
  11. `updated_at` datetime DEFAULT NULL,
  12. PRIMARY KEY (`idpoczta`),
  13. KEY `poczta_FI_1` (`idprofil_nadawca`),
  14. KEY `poczta_FI_2` (`idprofil_odbiorca`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;


kolumny status_nadawca i status_odbiorca moga przyjmowac wartosci:
0 - normalna wiadomosc
1 - wiadomosc w koszu
2 - wiadomosc usunieta

kazda akcja usuniecia zwieksza wartosc w kolumnie status_odbiorca lub status_nadawca.
czyli jak user chce przeniesc wiadomosc z folderu odebrane to zmienia sie na 1. jak chce usunac w kosza to zmienia sie na 2 i juz jej nie zobaczy nigdzie.

teraz juz pytanie techniczne
jak powinno wygladac zapytanie pobierajace dane dla akcji pokazKosz.
chcialbym tam polaczyc dane o profilach (nadawca, odbiorca).
zalozmy ze jestem zalogowany na idprofil = 2.
to bedzie cos takiego?

  1. SELECT * FROM poczta WHERE (idprofil_odbiorca = 2 AND status_odbiorca = 1) OR (idprofil_nadawca = 2 AND status_nadawca = 1)


--------------------
aplikacje internetowe | Symfony
Go to the top of the page
+Quote Post
Sedziwoj
post 1.08.2008, 13:34:29
Post #16





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


@AxZx
Moim zdaniem pole status powinno być FK do tabeli z statusami.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
.radex
post 1.08.2008, 15:19:23
Post #17





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


dlaczego tinyint(2) a nie tinyint(1) ?


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
Sedziwoj
post 1.08.2008, 16:41:37
Post #18





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Cytat(radex_p @ 1.08.2008, 16:19:23 ) *
dlaczego tinyint(2) a nie tinyint(1) ?


A co to za różnica? Przecież to i tak nie ma nic wspólnego z długością pola.
Cytat
Another extension is supported by MySQL for optionally specifying the display width of integer data types in parentheses following the base keyword for the type (for example, INT(4))


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
.radex
post 1.08.2008, 17:49:48
Post #19





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


Cytat(Sedziwoj @ 1.08.2008, 17:41:37 ) *
A co to za różnica? Przecież to i tak nie ma nic wspólnego z długością pola.


Masz rację. Zapomniałem o tym. Zwracam honor tongue.gif


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
superfrajer
post 1.08.2008, 18:55:03
Post #20





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 14.05.2007

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


Ja bym zrobil tak:

Message:
MessageId
Title
Description
CreatedAt
ReadAt

MessageStatus:
MessageStatusId
MessageId
UserId
DirectoryId


Wyslanie wiadomosci:
1) Tworzysz rekord Message, wypelniasz odpowiednie pola, ReadAt moze byc np. null
2) Tworzysz dwa rekordy MessageStatus:
Dla wysylajacego:
jego UserId, DirectoryId na rekord slownika Directories z 'Sent'
Dla odbierajacego:
UserId - id odbiorcy, DirectoryId - 'Inbox'

Gdy odbiorca otworzy wiadomosc (i wiadomosc nie jest w DirectoryId - 'Sent'):
1) Odswiezasz rekord z MessageId wpisujac do pola ReadAt aktualna date

Usuniecie wiadomosci:
1) Sprawdzasz czy dla kazdego MessageStatus z tym samym MessageId DirectoryId wskazuje na 'Deleted' (nie 'Trash', tam sobie wiadomosci moga lezec)

Dzieki temu rozwiazaniu uzytkownicy maja niezalezna kontrole nad wiadomoscia. Rowniez mozna wysylac wiadomosci
do wielu uzytkownikow na raz, oszczedzajac miejsce w bazie danych.
Tabela MessageStatus nie musi zawierac MessageStatusId, poniewaz mozna uznac ze MessageId + UserId bedzie zawsze unikalne.
Ale to kwestia gustu.

edit:
Dla wygody mozesz potem sobie stworzyc widok w postaci

Message + MessageStatus zlaczony po MessageId

edit:
Oczywiscie nie bedzie informacji o nadawcy i odbiorcy, ale to kwestia komplikacji widoku troche smile.gif Ale to niech ktos sie pomeczy bo ja spadam do domu smile.gif

Ten post edytował superfrajer 1.08.2008, 19:07:24
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 20:10