Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужен совет, по организации одной из таблиц БД 
:(
    Опции темы
Delphist
  Дата 16.9.2009, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: 1
Всего: 3



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

Таблицы:
 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'ом. Но хотелось бы послушать Ваши рекомендации.

Это сообщение отредактировал(а) Delphist - 16.9.2009, 09:40


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Deniz
Дата 16.9.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



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


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
former
Дата 16.9.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



ИХМО: Работа с БД должна быть возможна и без клиента.


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
pseud
Дата 16.9.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Экспёрт Тыдыщ
***


Профиль
Группа: Завсегдатай
Сообщений: 1175
Регистрация: 18.5.2007
Где: Минск, Беларусь

Репутация: 16
Всего: 40



подход номер 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>  



--------------------
Испытание чужого терпения можно считать успешным, если оно лопнуло...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0432 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.