Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Нужен совет, по организации одной из таблиц БД


Автор: Delphist 16.9.2009, 09:38
Вообщем хочу посоветоваться в одном вопросе. 
Для простоты понимания моего вопроса для начала кратко опишу ряд таблиц БД ответственные за склад. 

Таблицы:
 SKLAD_RAW - хранит данные о сырье которое имеется на складе
     SR_ID - идентификатор записи, primary key
     SKLAD_ID - идентификатор склада берется из внешней, foreign key
     RAW_ID - идентификатор сырья берется из внешней таблицы, foreign key
     ...
 SKLAD_RAW_PARTY   - хранит партии сырья
    SRP_ID - идентификатор записи, primary key
    SR_ID - ключ таблицы SKLAD_RAW, foreign key
    INCOME - приход
    PRICE - цена партии за един.
    DATE - дата прихода
  ...

SKLAD_EXPENSE - хранит расход по партиям
  SE_ID - идентификатор записи, primary key
  SRP_ID - ключ таблицы SKLAD_RAW_PARTY, foreign key
  EXPENSE - расход
  Date - дата расхода
...

Проблема в том что в организации данных по приходу, расходу и остатку я увидел 2 подхода решения задачи:
1)  Когда структура таблица в самом простом ее видете соответствует той, что я привел. Далее мы заводим хранимую процедуру, которая в качестве входных данных имеет SKLAD_ID и RAW_ID, а в качестве выходных возвращает полную инфу о сырье его приходе, расходе и остатке.
2) Второй же подходе отличается от первого, что остаток мы вычисляем не с помощью хранимой процедуры, а на клиенте например в OnCalcFields и плюс ко всему расчитанный остаток мы физически храним в таблице  SKLAD_RAW_PARTY, для чего туда добавляем дополнительное поле REMAINDER

Встал вопрос какой подход лучше использовать. В первом мне нравится то, что не нужны дополнительные поля и на клиенте нет лишних расчетов, второй же мне нравиться тем, что для каждой партии уже есть готовый остаток, который из любого места программы можно получить простым select'ом. Но хотелось бы послушать Ваши рекомендации.

Автор: Deniz 16.9.2009, 11:23
ИМХО, на клиенте считать остаток не есть гуд, 
Остаток товара по партии рассчитывается как SKLAD_RAW_PARTY.INCOME - sum(SKLAD_EXPENSE.EXPENSE).
Это обычный select, который не должен сильно напрячь сервер, индексы же есть.
Остался один вопрос:
Цитата(Delphist @  16.9.2009,  12:38 Найти цитируемый пост)
я увидел 2 подхода решения задачи
какой задачи? Получить остаток товара, с разбивкой по партиям, на складе/по всем складам?
Мне больше нравится 1 вариант.

Автор: former 16.9.2009, 11:26
ИХМО: Работа с БД должна быть возможна и без клиента.

Автор: pseud 16.9.2009, 12:19
подход номер 3:
создать вьюху и ее юзать:
Код

create or replace view V_SKLAD_RAW_PARTY as
select
  p.<поле1>,
  ..
  p.<полеN>,
  p.INCOME - sum(e.EXPENSE) as REMAINDER
from 
  SKLAD_RAW_PARTY p
  inner join SKLAD_EXPENSE e on e.SRP_ID = p.SRP_ID
group by
  p.<поле1>,
  ..
  p.<полеN>  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)