Как организовать актуальность и целостность данных в БД?
Добрый всем времени суток и с днем валентина, кто празднует!
Появился проект по созданию личного кабинета пользователя и появился следующий вопрос:
Как организовать взаимодействие базы данных с веб-приложухой на ASP.NET? И речь идет не о ConnectionString и т.п., а об архитектуре. Допустим есть следующие варианты:
1) Например приложение "пинает" SQL сервер на наличие изменений каждую, ну, например минуту и выкачивает эти изменения (как это можно устроить? При чем, чтобы некорректные данные не отправлялись в БД)
2) С помощью пакета каждую ночь данные выгружаются в БД кабинета из БД удаленной, происходит их коррекция и загрузка (но тут проблема, данные будут с отставанием день, каждый раз)
3) ...Не знаю, предложите)
Уверен, что сталкиваюсь с такой проблемой не первый, хотелось бы услушать ответ от опытных, может есть какой-то паттерн такого взаимодействия.
Важным является то, что, лучше бы, данные были актуальны каждый момент времени, чтобы это было отказоустойчиво (на случай, если структуру таблиц поменяли и например в одной из главных таблиц убрали столбец), ну и чтобы это все работало стабильно.
Например приложение "пинает" SQL сервер на наличие изменений каждую, ну, например минуту и выкачивает эти изменения (как это можно устроить? При чем, чтобы некорректные данные не отправлялись в БД)
Потому что сервер с данными общается не только с одним кабинетом, данные в него поступают и из других источников (смс - переводы, терминалы, другие кабинеты), следовательно, незаметно для нашего кабинета, там что-то может измениться, например, кто-то положил деньги на счет через Сбербанк и это ушло к нам в базу, а в нашем кабинете это не отобразится, если мы не запросим обновление у сервера.
Если хотите актуальности - то от поллинга не уйти.
Тут скорее нужно думать как грамотно организовать поллинг и как гарантировать доступность БД (в случае если IIS и БД на одном сервере - проблем нет).
Старайтесь отправлять как можно меньще данных - смотрите в сторону AJAX+JSON.
Актуализируйте только саммые важные данные, остальные отдельно по запросу пользователя (т.е. сделать обзорную страничку и несколько специализированных).
По поводу отказоустойчивости не понял - если убрали столбец из таблицы, то приложение нужно адаптировать. Как иначе?
Просто у нас поддержкой БД занимается другой отдел, база эта для нас, по сути - черный ящик, только вот блин, бывает так, что этот черный ящик перестает выдавать данные корректной структуры. В/из этого черного ящика запихиваем/получаем инфу не только мы, то есть кто-то со стороны вносит туда некорректные данные - а потом у нас что-то из-за этого может упасть. Плюс ко всему люди, которые поддерживают эту базу, могут ее часика на 3 так отрубить ее и как тогда быть? Личный кабинет должен максимально близкие к реальности данные отображать и уж точно не падать на 3 часа.
Alexey Sh: Это звучит плохо - неужели нельзя согласовывать друг с другом?
Данные со стороны не мешают, а вот структурные изменения!
Тогда как варинт - DataWarehouse, копируйте оригинальную базу и работайте с ней. Если оригинальная база недоступна или изменена - то задача копирования не сработает, но у вас будут хоть какие-то данные и программа будет в рабочем состоянии.
DataWarehouse можно автоматизировать - смотрите SSIS (IntegrationServices) или SQL Server-Agent с StoredProcedures.