Как организовать DataTables

leon777
Дата: 21.05.2014 21:45:00
Всем добрый вечер! Столкнулся со следующей проблемой.
Итак, мы имеем таблицы:

CLIENTS (клиенты)
Id
Last_name
First_name
Phone
------------------------------------------------------------------
ORDER (заказы)
Id
Date
Client_id (FK -> CLIENTS.Id)
------------------------------------------------------------------
GOODS (приобретенные товары)
Id
PriceId (FK -> PRICE.Id)
Code
OrderId (FK -> ORDER.Id)
------------------------------------------------------------------
PRICE (прайс-лист товаров)
Id
Name
Cost
------------------------------------------------------------------

Клиенты делают заказы. За один заказ можно приобрести несколько товаров.

На основной форме стоит компонент, отображающий все заказы (таблица ORDER). Но помимо информации непосредственно из таблицы ORDER мне для каждого заказа нужно отобразить ФИО клиента, который его выполнил, список товаров (одним полем) и.т.д. Т.е. нужны данные других таблиц.

Для достижения этой цели я создал ORDER_VIEW – вью которая объединяет данные из таблиц ORDER, CLIENT, GOODS, PRICE. На клиенте вместо ORDERDataTable я создаю ORDER_VIEWDataTable которая содержит как поля из таблицы ORDER так поля из других таблиц.

Все отлично, НО когда я перехожу с основной формы (на которой отображаются все заказы) на форму ‘Клиенты’ и там, например, меняю телефон клиента мне помимо изменения в таблице CLIENTDataTable нужно обновить данные в ORDER_VIEWDataTable (ведь в этой вью прописаны так-же и колонки с данными клиента).

Обновлять ORDER_VIEW полностью удобно, но долго - она большая.

Можно уйти от ORDER_VIEW и работать с нормализованными DataTable’ми. Но в таком случае доп. информацию клиентов нужно выбирать динамически из нужной таблицы – тоже время.

Кто-либо сталкивался с похожими проблемами? Что посоветуете?
D129
Дата: 22.05.2014 10:35:10
leon777,

Это не та проблема, решить которую можно вызвав некую волшебную функцию...

Если вы действительно хотите ее решить - то надо отказываться от прямого отображения базы данных.
Если изменения произошли там, то нет способа их получить, кроме как перечитать из базы.

Поэтому, можно построить в памяти обьекты, которые в памяти существуют в единственном экземпляре, отображаются при помощи байндинга на разные View, и при изменении полей-свойств этих обьектов они уведомляют и привязанные View, и слой доступа к базе, чтобы он сохранил изменения.

Это единственный путь решить подобные требования.

Если вы сейчас начнете делать добавки (без серьезной перестройки архитектуры), которые обновляют на всех экранах номер телефона при его изменении, то сделате все равно то же самое, только сложно и криво.

Но и этот путь не является "формулой абсолютного топлива" - ведь с базой будут работать с разных компьютеров....
:-)
pation
Дата: 22.05.2014 11:43:18
leon777
Обновлять ORDER_VIEW полностью удобно, но долго - она большая.

Можно уйти от ORDER_VIEW и работать с нормализованными DataTable’ми. Но в таком случае доп. информацию клиентов нужно выбирать динамически из нужной таблицы – тоже время.

Кто-либо сталкивался с похожими проблемами? Что посоветуете?


1.для этого используются DataSet ы
2.ещё лучше отказаться от использования DataTable в пользу ORMа