Казалось бы, простая задача
но, как показывает реальность - нифигааа )))
Имеется таблица LOG с полями
ID (инкрементный счётчик, индекс),
time (время рождения сообщения, не путать со временем попадания в базу данных! Это разное)
mess (само сообщение, содержимое - неважно, какое)
Итак, где-то формируются сообщения, хранится время создания сообщений. Затем пачка сообщений приходит на сервер, где сообщения сохраняются в базу (в общем случае - в произвольном порядке).
---------------------------
Рабочее место (клиент) закачивает себе сообщения с сервера, указывая минимальное значение ID, которое он (клиент) уже скачивал.
---------------------
Теперь нам всё нужно отобраззить в таблице на экране клиента. Допустим, сначала хотим отображать в порядке возрастания ID - тут всё предельно просто и красиво: храним "координаты" в программе в переменных
__int64 m_n64GridTopID____nm1;//id, который сейчас отображается вверху таблицы на экране. Если "==-1" - не валиден(делать всё время наверху)
__int64 m_n64GridCursorID_nm1;//id, на котором установлен курсор в таблице на экране. Если "==-1" - не валиден(делать всё время наверху)
//некий кеш для уменьшения количества обращений к базе
typedef std::map<__int64, message_body> td_LOG;
td_LOG m_LOG;
меняем "координаты", соответственно подгружаем недостающие сообщения из базы в кеш, радуемся.
---------------------
Затем задача такая: Показывать в таблице сортировкой по времени
Как с наиболее меньшими метаниями это реализовать?
Мысли у меня следующие:
1) самое простое в плане дальнейшей работы, но самое сложное в плане сохранения в базу - при сохранении в базу как-то вставлять сообщения так, чтобы если отсортировать по ID, то время тоже будет отсортировано всегда правильно (как это сделать, пока ещё не думал). Тут ещё проблема с синхронизацией с данными на клиенттах - ведь ID будут уже разные для одного и того же сообщения
2) другой вариант - оставить "бардак" со временем в базе, но индексировать время тоже. Но тут очередная проблема - время может повторяться. В итоге нелья применить "координаты", тип которых - время
3) оставляем всё как при сортировке по ID. "Координаты" - имеют тип времени. Перед выводом на экран создаём дополнительный массив (multimap), отсортированный по времени (но в message_body также храним и ID) и выводим в таблицу (тут надо ещё продумать взаимодействие двух массивов)
Какой вариант лучше или, может, вообще как-то по другому надо сделать ?