ad1) Limitowanie nieprzeczytanych to konieczność. Wiele kont jest porzucanych i chcąc nie chcąc musisz je zlimitować.
ad2) Nie o to mi chodziło. Chodzi mi o sytuację kiedy następuje dodanie do tabeli nieprzeczytanych kolejnych postów użytkownikom. Czy jest to robione w momencie napisania posta czy może dopiero w momencie zalogowania się użytkownika, albo dodane od czasu jego ostatniej akcji w serwisie. Innymi słowy czy masz coś w stylu:
- dodaj wszystkim userom tego posta jako nieprzeczytanego gdy jest dodawany do bazy (od razu dodaje wszystkim userom, co jest wygodne)
- dodaj konkretnemu userowi posty z data większą niż określona w momencie zalogowania (dodawanie konkretnemu userowi tylko raz na dłuższy czas),
- dodaj konkretnemu userowi posty z data większą niż czas jego ostatniej akcji w serwisie (dodawanie ewentualnych postów pomiędzy refreshami strony, bardzo aktualne dane )
Każde rozwiązanie ma swoje wady i zalety związane z obciążaniem systemu i rozpychaniem bazy.
Wersja 1: Dane są bardzo aktualne dla wszystkich, ale musisz napisać mechanizm kontrolujący limit postów. Poza tym powoduje przechowywanie nadmiaru danych zwłaszcza dla userów rzadko odwiedzających serwis. Oni niemal zawsze będą mieli limit wykorzystany.
Wersja 2: Posty są dodawane tylko raz w czasie całego pobytu - przy zalogowaniu, co zmniejsza obciążenie bazy, ale kosztem aktualności. User nie zobaczy nowych postów napisanych podczas jego pobytu w serwisie.
Wersja 3: To pewien kompromis wydajności z objętością bazy. Tabela nieprzeczytanych jest uzupełniana i sprawdzana przy każdym/co ileś requestów usera. Dzięki temu tylko w czasie bytności usera zachodzą operacje na bazie postów i są one w miarę aktualne. Obciążenie bazy jednak mocno może urosnąć, gdyż operacja sprawdzenia czy są nowe posty od ostatniego żądania, dodania ich i ewentualnego usunięcia wykraczających poza limit może być znacząca.
ad 3) Rozwiązanie ze stronami jest bardziej obciążające, ale eliminuje sytuację, gdy user wszedł tylko na pierwszą stronę, która nie zawiera nieprzeczytanego posta, a post uznano za przeczytany. Znów dylemat wydajność kontra dokładność. Tutaj więc bardziej osobiste preferencje i możliwości serwera się liczą, podobnie jak w poprzednim punkcie.
ad 4) Ale po co Ci primary key tak naprawdę, skoro nigdy nie używasz go? System jedynie przy wewnętrznych operacjach. Dla Ciebie najistotniejsze jest operowanie na id_użytkownika i id_posta. Tylko one mają znaczenie. Lepiej chyba je zaindeksować by zrobić:
DELETE FROM nieczytane WHERE id_usera = X
By usunąć wszystkie nieczytane posty tego usera (opcja "Oznacz wszystkie jako przeczytane")
Czy też może
DELETE FROM nieczytane WHERE id_posta IN ( X, Y, Z)
gdy usuwamy posty z przeczytanego tematu. Drugi przypadek to w zasadzie najlepiej pogodzić z JOINEM tabeli postów by wyłapać id tematu czytanego, ale to tylko moja sugestia. Zovbacz, że tylko tego koniecznie potrzebujesz. Dla wygody jeszcze możesz ewentualnie dodać id_tematu czy id_forum, by zredukować operacje JOINowania z odpowiednimi tabelami by wyszukać ilość postów nieprzeczytanych z określonego forum lub tematu. Tu jest pułapka jednak... Musisz uważać na opcję przenoszenia tematu do innego forum lub wydzielania postów do innego tematu.
Co do tylko tego tematu to widać, że nie szukałeś dobrze. Użyj w wyszukiwarce słów: nieprzeczytane, posty, oznaczanie i kilka innych w różnych kombinacjach, bo ten co znalazłeś to nie jedyny temat tutaj o tym problemie tyczący.