Как быть?
Как быть?
Проектирую БД, есть одна проблема:
будет таблица в которой будут указаны услуги и цены на них. В процессе работы цены будут меняться (услуг около 400!), я никак не могу сообразить - как мне сделать так чтобы хранились старые цены!
Если тупо дублировать каждый раз с новой датой услуги, то думаю что БД будет возрастать очень быстро, а если услуги сделать полями то 400 полей не слишком ли много ?
Подскажите, ПЛЗ, профи!
будет таблица в которой будут указаны услуги и цены на них. В процессе работы цены будут меняться (услуг около 400!), я никак не могу сообразить - как мне сделать так чтобы хранились старые цены!
Если тупо дублировать каждый раз с новой датой услуги, то думаю что БД будет возрастать очень быстро, а если услуги сделать полями то 400 полей не слишком ли много ?
Подскажите, ПЛЗ, профи!
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05
Так и фиксируй.
Для ещё действующих цен d_end будет равно дефолту, будущей дате.
Если цена на услугу изменилась, закрываем период текущей цены и вставляем новую запись, с "открытым" периодом.
Выбирать текущую (как впрочем и на любую дату) цену так:
Код: Выделить всё
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);
Если цена на услугу изменилась, закрываем период текущей цены и вставляем новую запись, с "открытым" периодом.
Выбирать текущую (как впрочем и на любую дату) цену так:
Код: Выделить всё
select *
from PRICES
where UslugaID=:UslugaID and :WantedPriceDate between d_begin and d_end
Может быть, это поможет?
http://forum.ibase.ru/phpBB2/viewtopic.php?t=2775
http://forum.ibase.ru/phpBB2/viewtopic.php?t=2775
а зачем закрытие периуда цены если открытием новой старый и так закроется ?
запрос
ЗЫ ответил раньше чем прочитал ссылку ответ снимается
Код: Выделить всё
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
ЗЫ ответил раньше чем прочитал ссылку ответ снимается
ну и зря снимается. ставишь цену равной null - значит с этой даты цены на этот товар не существует. то есть, значение null закрывает действие старой цены, не открывая новую.Attid писал(а):ЗЫ ответил раньше чем прочитал ссылку :) ответ снимается :)
более развернуто я ответил в той теме по ссылке.
резюме: второе поле даты(dateend) не нужно, ибо мусор.
если кому надо, для IB7 это будет выглядеть так:Attid писал(а):Код: Выделить всё
select first 1 PRICE from PRICES where UslugaID=:UslugaID and :WantedPriceDate < d_begin order by d_begin desc
Код: Выделить всё
select PRICE
from PRICES
where UslugaID=:UslugaID and :WantedPriceDate < d_begin
order by d_begin desc
rows 1
into ...
-
- Заслуженный разработчик
- Сообщения: 1436
- Зарегистрирован: 15 сен 2005, 09:05