"Pytanie, po co to robisz" - programista raczej nigdy nie pyta po co ktoś coś pisze, to jest realizacja jakiejś potrzeby.
Niby tak, ale jednak nie do końca ;)
Po pierwsze - znając potrzeby/wymagania to łatwiej jest coś doradzić. Bo znaczenie ma np. to, czy priorytetem jest szybkość, pewność dostarczenia wiadomości, ma być lekkie, ma działać online czy jako desktopowa aplikacja itp. Także wiedza o tym, jak dane rozwiązanie ma być stosowane jest istotna do zaproponowania najsensowniejszego rozwiązania.
Po drugie - pytałem, bo inaczej podejdziesz do tematu budowania apki do wpisania w CV albo żeby sobie z kumplami popisać podczas grania w coś-tam, a inaczej jeśli to ma być produkt dla firmy, z którego korzysta kilkaset osób jednocześnie.
Planuję zachować całą historię rozmów. W związku z tym jakie jest lepsze rozwiązanie?
Mimo wszystko - raczej SQL nie jest dobrą drogą ;)
W sensie - trzeba będzie je trzymać jakoś w bazie, ale ona raczej powinna służyć za archiwum, a nie jako główny silnik do trzymania bieżących danych.
Ja bym tutaj postawił jakiś własny serwis (może są gotowe rozwiązania/biblioteki w C++, nie mój ekosystem, nie wiem) czy usługę, która by była pośrednikiem między klientami a bazą. Ten pośrednik powinien korzystać z jakiejś bazy trzymanej w pamięci, coś szybkiego w stylu Redisa, a potem co jakiś czas zrzucać wiadomości do SQL, który robi za bazę/archiwum.
Zastanów się także, czy potrzebny jest SQL, czy jakieś prostsze rozwiązanie typu NoSQL - bo jeśli to ma być jedna prosta tabelka z paroma kolumnami w stylu nadawca, odbiorca, treść, data
to może pchanie tego do SQL jest przegięciem.
Jak zrealizować problem odbierania wiadomości, które będą zalegały w kolejce?
No trzeba dodać jakąś flagę, która oznacza stan wiadomości. Można zrobić tak, jak pisze @johnny_Be_good - czyli pole typu boolean
, ale ja bym raczej dał tam datę odczytania. Bo z samego true/false
odczytasz jedynie czy przeczytał, ale lepiej chyba mieć informację o tym, kiedy to się stało.
I ważna rzecz - pisałeś wcześniej coś o sprawdzaniu czy ID
wiadomości jest większe od ostatniej przeczytanej. Nie idź w tym kierunku (ani nie patrz na daty) bo może być tak, jak chociażby na 4P: loguję się po jakimś czasie, mam 10 nieprzeczytanych wiadomości. Nie mam czasu na przejrzenie wszystkich, wybieram jakąś dla mnie ważną/interesującą ze środka listy. Sprawdzając jedynie ID odczytanej wiadomości by spowodowało, że wszystkie wiadomości na liście poniżej przeczytanej przeze mnie by były oznaczone jako przeczytane. A tego raczej nie chcemy - także trzeba dla każdej z nich niezależnie zapisywać w bazie jej stan przeczytania/nieprzeczytania.
rozmówca jest dostępny i w kolumnie availalble [...] wysłać wiadomość bezpośrednio z serwera do rozmówcy
NIEEEEEEE
Bo koleś niby jest aktywny, ale tylko dlatego, że ma włączonego kompa i nie zamknął aplikacji. Podejdzie do kompa, wyłączy go, niczego nie przeczyta, a jutro jak odpali apkę to już będzie miał te wiadomości oznaczone jako przeczytane.