Собственно, обычная система, собирающая данные о положении с подвижных объектов с использованием GPS. Существует таблица, куда складываются координаты. Сервер в эту таблицу только пишет, клиенты только читают. Задачи — получить текущие координаты устройств (то есть, последние) и историю. Если с историей все понятно, то с текущими коодинатами есть вопрос. Понятно, что есть куча вариантов как это сделать, и хочется выбрать наилучший с точки зрения производительности и масштабируемости.
Вариант 1 — одна таблица с историей, текущие данные получаются при помощи select top 1 * from... order by. При наличии индексов работает нормально. Из плюсов — мало возможностей получить дедлок, так как при чтении и записи по индексу блокироваться будет только одна запись и они будут разными для клиента и для сервера.
Вариант 2 — отдельная таблица с текущими координатами. При добавлении новой записи в историю сервер обновляет соответствующую запись в текущей таблице. Смущает, что в этом случае и сервер и клиент могут одновременно обратиться к одной и той же записи — потенциальная проблема с производительностью из-за блокировок.
Вариант 3 — аналогично 2-му, но с версионностью — то есть в случае, если сервер и клиент одновременно обратились к одной и той же записи, то клиент получает предыдущую версию, а сервер пишет в новую. Честно говоря, не уверен что это пройдет с MSSQl даже на уровне изоляции транзакций SNAPSHOT.
Итак, как лучше? может есть другой вариант?
Шурыгин Сергей
"Не следует преумножать сущности сверх необходимости" (с) Оккам