Страница 1 из 1
Как быть?
Добавлено: 15 янв 2007, 16:13
AnryGTR
Проектирую БД, есть одна проблема:
будет таблица в которой будут указаны услуги и цены на них. В процессе работы цены будут меняться (услуг около 400!), я никак не могу сообразить - как мне сделать так чтобы хранились старые цены!
Если тупо дублировать каждый раз с новой датой услуги, то думаю что БД будет возрастать очень быстро, а если услуги сделать полями то 400 полей не слишком ли много ?
Подскажите, ПЛЗ, профи!
Добавлено: 15 янв 2007, 16:25
Dimitry Sibiryakov
Посчитай скорость своего "быстрого роста", а потом подели на него доступный размер винта чтобы получить время, за которое он забьется. Я не удивлюсь если это время будет исчисляться сотнями лет.
Добавлено: 15 янв 2007, 16:44
WildSery
А ты не дублируй.
Пусть фиксируются только изменения цены, и только для указанной услуги.
Добавлено: 15 янв 2007, 18:40
AnryGTR
Как фиксировать-то? Мне жу нужно и старые цены на эту услугу хранить!
но всё равно ,ребята, спасибо за ответы!
Добавлено: 15 янв 2007, 20:38
WildSery
Так и фиксируй.
Код: Выделить всё
create table PRICES(
ID integer,
UslugaID integer,
Price numeric(9,2),
d_begin
d_end default '01.01.2100');
alter table PRICES add constraint pk_prices primary key (id);
create index prices_idx1 on PRICES (UslugaID, d_begin, d_end);
Для ещё действующих цен d_end будет равно дефолту, будущей дате.
Если цена на услугу изменилась, закрываем период текущей цены и вставляем новую запись, с "открытым" периодом.
Выбирать текущую (как впрочем и на любую дату) цену так:
Код: Выделить всё
select *
from PRICES
where UslugaID=:UslugaID and :WantedPriceDate between d_begin and d_end
Добавлено: 16 янв 2007, 01:31
CyberMax
Добавлено: 16 янв 2007, 13:40
Attid
а зачем закрытие периуда цены если открытием новой старый и так закроется ?
Код: Выделить всё
create table PRICES(
ID integer,
UslugaID integer,
Price numeric(9,2),
d_begin);
alter table PRICES add constraint pk_prices primary key (id);
запрос
Код: Выделить всё
select first 1 PRICE
from PRICES
where UslugaID=:UslugaID and :WantedPriceDate < d_begin
order by d_begin desc
ЗЫ ответил раньше чем прочитал ссылку

ответ снимается

Добавлено: 18 янв 2007, 14:54
AnryGTR
Спасибо всем! Справился!
Респект
CyberMax!
Добавлено: 25 янв 2007, 14:16
dsd_corp
Attid писал(а):ЗЫ ответил раньше чем прочитал ссылку :) ответ снимается :)
ну и зря снимается. ставишь цену равной null - значит с этой даты цены на этот товар не существует. то есть, значение null закрывает действие старой цены, не открывая новую.
более развернуто я ответил в той теме по ссылке.
резюме: второе поле даты(dateend) не нужно, ибо мусор.
Attid писал(а):
Код: Выделить всё
select first 1 PRICE
from PRICES
where UslugaID=:UslugaID and :WantedPriceDate < d_begin
order by d_begin desc
если кому надо, для IB7 это будет выглядеть так:
Код: Выделить всё
select PRICE
from PRICES
where UslugaID=:UslugaID and :WantedPriceDate < d_begin
order by d_begin desc
rows 1
into ...
Добавлено: 25 янв 2007, 14:51
Dimitry Sibiryakov
dsd_corp писал(а):резюме: второе поле даты(dateend) не нужно, ибо мусор.
С ним удобнее, когда в таблице цен хранится не только цена и выборка идет одним запросом с номенклатурой.