Структура базы приход—расход

CyberX
На сайте с 08.03.2008
Offline
51
747

Кто сталкивался с созданием сабжа ?

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

Приходы 1 раз в неделю, в приходе обычно 10-30% количества наименований.

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

Подскажите как лучше реализовать. Использоваться будет на php.

Шустрый хостинг (http://www.colocat.ru) за нормальные деньги (Москва). 30 дней тестовый период. Рекомендую копирайтера aronskaya (/ru/users/73753). Отличные авторские тексты.
[Удален]
#1

Стандартная задачка по курсу БД в любом техническом вузе.

goods {id, name, price, что еще} //Товары, возможно нужно две цены, закупочная и реализационная

managers {id, name, что еще} //манагеры

orders {id, m_id (FK->managers.id), date, type (1/0 - пришло/ушло), "вся возможная инфа"} //заказы

goods_to_orders {id, g_id (FK->goods.id), o_id (FK->orders.id), count } //товары привязанные к накладной, с учетом количества

FK если что - foreign key (внешний ключ). ID везде является PK (Primary Key)

Запросы в общем довольно просто писать. Узнать сумму товаров списанных (т.е. по отпускной накладной) каждым манагером за конкретный период например


SELECT sum(`goods`.`price` * `goods_to_orders`.`count`) AS total, `managers`.`name` AS manager
FROM `goods`,`goods_to_orders`, `orders`,`managers`
WHERE
`goods`.`id`=`goods_to_orders`.`g_id` AND
`orders`.`id`=`goods_to_orders`.`o_id` AND
`orders`.`m_id`=`managers`.`id` AND
`orders.date` BETWEEN 'дата1' AND 'дата2' AND
`orders`.`type` = 0
ORDER BY `managers`.`name` ASC
CyberX
На сайте с 08.03.2008
Offline
51
#2

neolord, суть понятна. Спасибо.

Меня больше беспокоят остатки. Получается для вычисления остатков получается довольно объемное вычисление. К примеру за полгода накопится около 1000 приходов, миллиона записей о продаже. Базе придется при каждом обращении все это считать ?

Или сделать дополнительную таблицу в которой складывать остатки скажем после каждого прихода ?

[Удален]
#3

Остатки это типа все что приехало минус все что уехало? Можете конечно и отдельную таблицу замутить, но вообще это тоже несложно вычисляется при помощи group by - один запрос с парой подзапросов. А запросы кешируются.


select (`income`-`outcome`) as `residue`, `goods`.`name` as `good`
from
(select sum(`goods_to_orders`.`count`) as `income`,`goods_to_orders`.`g_id` as `g_income_id`
from `goods_to_orders`,`orders`
where `goods_to_orders`.`o_id`=`orders`.`id` and `orders`.`type`=1
group by `goods_to_orders`.`g_id`) t_income,

(select sum(`goods_to_orders`.`count`) as `outcome`,`goods_to_orders`.`g_id` as `g_outcome_id`
from `goods_to_orders`,`orders`
where `goods_to_orders`.`o_id`=`orders`.`id` and `orders`.`type`=0
group by `goods_to_orders`.`g_id`) t_outcome,

`goods`

where
`goods`.`id`=`g_income_id`
and
`goods`.`id`=`g_outcome_id`

Может конечно не самый оптимальный запрос, но думать особо не хотелось =)

Можно вообще обойтись без подзапросов, если в поле type хранить не 1/0 а 1/-1 и умножать это значение на count в таблице goods_to_orders при джойне =)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий