Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wiadomości PW - odebrane / wysłane
Forum PHP.pl > Forum > Bazy danych > MySQL
japolak
witam

jak w temacie

interesuje mnie stworzenie wewnetrzej komunikacji miedzy użytkownikami.

z możliwością - przejrzenia historii rozmowy ( tzn. pod 4 odpowiedzią będzie widoczna 3 2 i 1 )


Tak zanim zerkłem na forum myślalem o takiej strukturze:

tabela Odebrane:
id_wiadomości_pierwotnej
id_wiadomosci_odebranej
id_użytkownik (odbiorca)
id_nadawca
tytul
tresc
data

tabela Wysłane:
id_wiadomości_pierwotnej
id_wiadomosci_wyslane
id_użytkownik (nadawca)
id_odbiorca
tytul
tresc
data


po wyslaniu 1 wiadomosci zapisuje się ona w odbiorczej u adresata i w wslanej u nadawcy z id_wiadomosci_pierwotnej, po odpowiedzi
id_wiadomości_pierwotnej - pozostaje bez zmian, natomiast id_wiadomosci_wyslane/odberane sie zmieniaja jak rowniez wszystkie pozostałe dane.

to co przejrzałem na forum nie odpowiada moim założeniom (lub błędnie to interpretuje:))

prosze o inf. czy taka baza bedzie dobra - czy da sie to latwiej zrobić.
Crozin
Jeżeli chcesz mieć prywatne wiadomości z normalną historią konwersacji, potrzebujesz:
1. Obiektu reprezentującego konwersację: id, id_nadawcy, id_odbiorcy, temat, ilosc_nieodczytanych_wiadomosci_nadawcy, ilosc_nieodczytanych_wiadomosci_odbiorcy, data_utworzenia.
2. Obiektu reprezentującego pojedynczą wiadomość w obrębie konwersacji: id, id_konwersacji, id_nadawcy, id_odbiorcy, tresc, data_utworzenia.

Przy dodaniu nowej wiadomości w konwersacji (dotyczy również utworzenia samej konwersacji) zwiększasz ilosc_nieodczytanych_wiadomosci_nadawcy/ilosc_nieodczytanych_wiadomosci_odbiorcy o jeden - to rozwiązuje problem oznaczania konwersacji z nowymi wiadomościami. Przy odczycie zerujesz odpowiednie pole.
japolak
Cytat(Crozin @ 20.01.2014, 21:01:20 ) *
Jeżeli chcesz mieć prywatne wiadomości z normalną historią konwersacji, potrzebujesz:
1. Obiektu reprezentującego konwersację: id, id_nadawcy, id_odbiorcy, temat, ilosc_nieodczytanych_wiadomosci_nadawcy, ilosc_nieodczytanych_wiadomosci_odbiorcy, data_utworzenia.
2. Obiektu reprezentującego pojedynczą wiadomość w obrębie konwersacji: id, id_konwersacji, id_nadawcy, id_odbiorcy, tresc, data_utworzenia.

Przy dodaniu nowej wiadomości w konwersacji (dotyczy również utworzenia samej konwersacji) zwiększasz ilosc_nieodczytanych_wiadomosci_nadawcy/ilosc_nieodczytanych_wiadomosci_odbiorcy o jeden - to rozwiązuje problem oznaczania konwersacji z nowymi wiadomościami. Przy odczycie zerujesz odpowiednie pole.



no ok.. co jeśli uzytkownik chciałby skasować wiadomości ? nie ma tu takiej opcji.. jesli skasuje to skasuje dla siebie i np nadawcy ..
Moze jakaś dodatkowa flaga?
Crozin
1. Nigdy nie zrozumiem po co w systemach prywatnych wiadomości wprowadza się ich usuwanie czy ograniczoną pojemność skrzynki.
2. Jeżeli już chcesz możesz dodać do tabeli konwersacji kolumny usunięte_przez_adresata_o, usunięte_przez_nadawcę_o.
japolak


ok
zostawie swoją wersje dla potomnych:)


wiec tak. podczas pisania kodu doszedłem do wniosku ze wystarczy tylko 1 tabela. jej przykładowa struktura tak wygląda:

  1.  
  2. CREATE TABLE IF NOT EXISTS `pw_cont` (
  3. `id_pw` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  4. `id_ob` int(10) UNSIGNED NOT NULL,
  5. `id_usr_send` int(5) UNSIGNED NOT NULL,
  6. `id_usr_rece` int(5) UNSIGNED NOT NULL,
  7. `title` text COLLATE utf8_polish_ci,
  8. `content` text COLLATE utf8_polish_ci,
  9. `dell_by_usr_send` tinyint(1) UNSIGNED NOT NULL,
  10. `dell_by_usr_rece` tinyint(1) UNSIGNED NOT NULL,
  11. `read` tinyint(1) UNSIGNED NOT NULL,
  12. `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  13. PRIMARY KEY (`id_pw`)
  14. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;
  15.  


natomiast aplikacja obsługuje to w następujący sposób:
1. Wyświetlanie:
a. sprawdzam czy jest dostęp do wiadomosci ( uzytkownik musi byc albo adresatem albo odbiorcą)
b. skrzynka odbiorcza - wyswietlam tylko wiadomosci ktore maja flage dell_by_usr_rece ustawiona na 0
c. skrzynka nadawcza - wyswietlam tylko wiadomosci ktore maja flage dell_by_usr_send ustawiona na 0
d. jesli read ma flage 0 to uzytkownikowi pokazuje sie info ze ma nieprzeczytana wiadomosc (liczy sume nierzpeczytanych wiadomosci )
e. flaga read automatycznie ustawiana jest na 1 po wejsciu w wiadomosc przez odbiorce. (wiadomosc jest pogrubiona dopuki nie zostala przeczytana)
f. po wejsciu w konkretna wiadomosc, w przypadku gdy rozmowa toczyla sie juz wczesniej - wiadomosc najnowsza wyswietla sie na gorze - a pozostale z tlem przyciemnionym i tabulatorem na dole.

2. dodawanie:
a. id_ob - zmieniane jest tylko w przypadku zalozenia nowego tematu ,
b. przy odpowiedzi - do title dopisuje ciąg "re: "

3. usuwanie:
a. gdy nadawca usuwa - sprawdzam czy wiadomosc nie zostala juz usunieta przez odbiorce ( sprawdzam dell_by_usr_rece ) jesli ustawione jest na 0 (nie usunieta) to ustawiam dell_by_usr_send = 1; jesli ustawione 1 to kasuje caly rekord z tabeli.


podczas pisania tej wypowiedzi, doszedłem do wniosku ze to usuwanie jest wadą tego sytemu.
bo gdy usuniemy cala wiadomosc wtedy podczas wyswietlania nadrzędnych odpowiedzi - ta jedna konretna wiadomosc sie juz nie wyswietli.
- zastanowie sie tu cz nie nadpisywac jednak caly czas contenta wczesniejszymi contentami.

gdyby ktoś chciał zobaczyć jak to wyglada w realu to zapraszam do zarejestrowania sie na mojej stronce www.kosmosnews.pl - przetestowania.
markonix
Zrobiłeś tak jak jest na FB - nie ma tam konwersacji - zawsze rozmowa z daną osobą to kontynuacja poprzednich wiadomości.
Nie ukrywam, że tak jest prościej i w komunikatorach zbliżonych do czata na pewno jest to wygodniejsze, jednak na forach dzielenie na wątki przeważa pod względem korzyści.
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-2024 Invision Power Services, Inc.