powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / DiffGram
12 сообщений из 12, страница 1 из 1
DiffGram
    #38073128
alex_iva1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер уважаемому коллективу. Нужен архитектурный совет от практиков, которые сталкивались с такой задачей.

Есть 3-уровневое приложение: 1) Winforms - 2) IIS+Asp.Net Web Services - 3) SQL Server 2008. Особенность среды - каналы связи между 1) и 2) с низкой пропускной способностью.

Клиент получает с сервера документ на редактирование в виде датасета довольно сложной (десятки таблиц), но древовидной структуры (т.е. циклических связей нет). Естественно, он был на сервере зазипован, на клиенте раззипован. Датасет, вообще говоря, большой (относительно канала связи :)). Пользователь что-то в нём редактирует (как правило, очень немного). Нажимает на кнопку Сохранить.

Мы должны что-то отправить с 1) на 2). Подозреваю, что это должен быть
А) GetChanges() из датасета, сериализированный в виде дифграммы;
Б) Или сам датасет, сериализированный в виде дифграммы?
Естественно, оно перед отправкой на сервер зипуется, а там раззиповывается. На 2) создаётся датасет, тейбладаптеры вносят изменения в таблицы БД (т.е. в 3)).
Вариант зазиповать датасет целиком и на сервере полностью перенакрыть документ в БД поверх существующего не рассматривается по ряду причин.

Но это ещё не всё. Пользователь, вообще говоря, продолжает редактировать документ. И получается, что наш датасет на уровне 1) нужно бы привести к виду, соответствующему 3). Перегружать на клиента весь датасет по-новой опять-таки не хочется - большой. В то же время понятно, что, например, у строк, которые были вставлены, поменяются идентификаторы (в каждой таблице есть identity-поле). Т.е хочется вернуть назад на клиента результат обработки дифграммы на сервере и вмёрджить его в тот датасет, который уже имеется на клиенте на момент нажатия на кнопку Сохранить.

Как лучше вмёрдживать :)?
В) сначала сделать клиентсокму датасету RejectChanges, потом Merge ответа с 2)
Г) сначала сделать клиентсокму датасету AcceptChanges, потом Merge ответа с 2)
Д) ничего не делать с клиентсикм датасетом, потом Merge ответа с 2)

Может, есть вообще другие варианты? (Энтитис фреймворк не предлагать, использование датасетов "предопределено свыше")

Просьба откликнуться, у кого есть опыт. Ради Бога, простите за много букв.
...
Рейтинг: 0 / 0
DiffGram
    #38073130
Фотография Абсолют
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DataSet гонять туда сюда, это мощно.
...
Рейтинг: 0 / 0
DiffGram
    #38073148
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_iva1,
Правильно ли я понимаю, что пользователь постоянно работает с определенным сегментом хранилища ( сервера) у себя на компе,и ему надо синхронизировать данные сегмента у себя, с сегментом на сервере?
Если да, то причем тут датасет?
...
Рейтинг: 0 / 0
DiffGram
    #38073157
alex_iva1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

Да. Можно сказать и так. Что Вы предлагаете вместо датасета? На всякий случай, дотнет везде второй.
...
Рейтинг: 0 / 0
DiffGram
    #38073160
alex_iva1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, сегмент очень маленький. Т.е. имеется хранилище документов, которое в БД имеет реляционную структуру, аналогичную структуре датасета. Документов десятки миллионов. Один отдельный из них загружается юзером на редактирование в виде датасета.
...
Рейтинг: 0 / 0
DiffGram
    #38073162
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_iva1,
я ничего не предлагаю, просто писать свою синхронизацию, или воспользоваться готовой
алгоритм простой.
у клиента фрагмент базы с сервера.
1 открывается приложение происходит синхронизация.
2 клиент сделал изменения у себя, происходит синхронизация
3 клиент вышел покурить, пришел к компу, синхронизация по требованию ( что там на сервере произошло без меня)
...
Рейтинг: 0 / 0
DiffGram
    #38073168
alex_iva1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи1 открывается приложение происходит синхронизация.

Нет. Я не храню на клиенте все миллионы документов. Он выбирает один конкретный на редактирование, и вот только тогда данные загружаются к нему.

Где-то в степиalex_iva1,
я ничего не предлагаю, просто писать свою синхронизацию, или воспользоваться готовой
алгоритм простой.

Если можно, поподробнее - о какой синхронизации идёт речь.
...
Рейтинг: 0 / 0
DiffGram
    #38073173
alex_iva1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Датасет можно описать в стандартных понятих примерно так:
- одна запись из таблицы Orders
-- к ней все записи из таблицы OrderItems
--- к ним все записи из таблицы OrderItemDetails
-- к ней все записи из таблицы, скажем, OrderClients :)
-- к ней все записи из таблицы, скажем, OrderAdditionalDocumentRefs :)
и т.д.

Таблиц около 30, т.к. документ на самом деле имеет достаточно сложную структуру.
...
Рейтинг: 0 / 0
DiffGram
    #38073177
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_iva1,
синхронизация по времени обновлении записи
если одна запись.
можно сделать ее объектный мап, передать этот объект клиенту, а потом вернуть его на сервер, а там трансформировать в sql.
то что она тянет с собой десятки таблиц ( уж шибко нормализовано) не беда, вы же их не собиратель править на клиенте?
...
Рейтинг: 0 / 0
DiffGram
    #38073178
alex_iva1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиalex_iva1,
синхронизация по времени обновлении записи
если одна запись.
можно сделать ее объектный мап, передать этот объект клиенту, а потом вернуть его на сервер, а там трансформировать в sql.

Какие преимущества даёт объектный мап (который тоже нужно сериализировать) против датасета, который легко сериализируется в xml и десериализируется обратно?

Где-то в степиalex_iva1,
то что она тянет с собой десятки таблиц ( уж шибко нормализовано) не беда, вы же их не собиратель править на клиенте?
редактироваться может (вообще говоря - зависит от прав пользователя, но это уже другая песня) любая информация в любой из таблиц
...
Рейтинг: 0 / 0
DiffGram
    #38073185
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_iva1,
объект легко сериализуется, скрывает структуру базы, в десятки разы меньше датасета, легко ложиться га форму.
по второму, вы же сказали что править запись, это одно.
а править таблицы сателлиты и справочники это совсем другая единица работы.
Если не объекты, то действительно гоняйте датасеты, ничего страшного нет,
...
Рейтинг: 0 / 0
DiffGram
    #38075074
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_iva1Мы должны что-то отправить с 1) на 2). Подозреваю, что это должен быть
А) GetChanges() из датасета, сериализированный в виде дифграммы;
Б) Или сам датасет, сериализированный в виде дифграммы?

Google-> CQRS architectural pattern

Смысл в следующем
1. на клиента грузится состояние объекта, который должен редактироваться.
2. пользователь редактирует объект, все действия сохраняем в виде лога.
3. заливаем на сервер лог действий, которые пользователь произвел ( CQRS saga ).
4. на стороне сервера применяем к данным, которые есть на сервере, предварительно сравнивая версии.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / DiffGram
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]