Как быть?

Модераторы: kdv, CyberMax

Ответить
AnryGTR
Сообщения: 116
Зарегистрирован: 15 янв 2007, 15:58

Как быть?

Сообщение AnryGTR » 15 янв 2007, 16:13

Проектирую БД, есть одна проблема:
будет таблица в которой будут указаны услуги и цены на них. В процессе работы цены будут меняться (услуг около 400!), я никак не могу сообразить - как мне сделать так чтобы хранились старые цены!
Если тупо дублировать каждый раз с новой датой услуги, то думаю что БД будет возрастать очень быстро, а если услуги сделать полями то 400 полей не слишком ли много ?
Подскажите, ПЛЗ, профи!

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 15 янв 2007, 16:25

Посчитай скорость своего "быстрого роста", а потом подели на него доступный размер винта чтобы получить время, за которое он забьется. Я не удивлюсь если это время будет исчисляться сотнями лет.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 15 янв 2007, 16:44

А ты не дублируй.
Пусть фиксируются только изменения цены, и только для указанной услуги.

AnryGTR
Сообщения: 116
Зарегистрирован: 15 янв 2007, 15:58

Сообщение AnryGTR » 15 янв 2007, 18:40

Как фиксировать-то? Мне жу нужно и старые цены на эту услугу хранить!
но всё равно ,ребята, спасибо за ответы!

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 15 янв 2007, 20:38

Так и фиксируй.

Код: Выделить всё

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

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 16 янв 2007, 01:31

Может быть, это поможет?
http://forum.ibase.ru/phpBB2/viewtopic.php?t=2775

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 16 янв 2007, 13:40

а зачем закрытие периуда цены если открытием новой старый и так закроется ?

Код: Выделить всё

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 

ЗЫ ответил раньше чем прочитал ссылку :) ответ снимается :)

AnryGTR
Сообщения: 116
Зарегистрирован: 15 янв 2007, 15:58

Сообщение AnryGTR » 18 янв 2007, 14:54

Спасибо всем! Справился! :D
Респект CyberMax!

dsd_corp
Сообщения: 8
Зарегистрирован: 12 ноя 2006, 15:32

Сообщение dsd_corp » 25 янв 2007, 14:16

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 ...

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 25 янв 2007, 14:51

dsd_corp писал(а):резюме: второе поле даты(dateend) не нужно, ибо мусор.
С ним удобнее, когда в таблице цен хранится не только цена и выборка идет одним запросом с номенклатурой.

Ответить