|
Программирование >> Проектирование баз данных
pIoducts. prices !! discou Puc. 7.1 Модель данных, обеспечивающая поддержку скидок Мы принимаем решение не включать в дочернюю таблицу столбец даты из родительской таблицы, чтобы в дочерней записи содержался только частичный внешний ключ . Учитывая наше утверждение о том, что диапазон дат дочерней записи входит в диапазон дат родительской записи, мы можем вывести эту родительскую запись, зная FPRICEPRODUCTCODE (в нашем случае) и диапазон дат для скидки. Мы видели случаи, когда этот подход принят на вооружение, но у нас есть серьезные замечания, а именно: Мы не можем использовать ограничения внешнего ключа для обеспечения связи; нам пришлось бы использовать триггеры. Реляционные пуристы в ужасе вскинули бы руки: мы нарушаем одно из фундаментальных правил реляционной модели, о чем свидетельствует сложность попытки представления структуры-результата с помощью наших соглашений о моделировании. Производительность адекватна, если речь идет о поиске цены за вычетом скидки на определенную дату, но при поиске агрегированных показателей, например средней цены-нетто за год, с производительностью возникают проблемы. Сама модель также вызывает ряд вопросов. Вот самые важные: Можно ли модифицировать FROM и ТО одного диапазона скидок для данного товара? Может ли измениться цена товара при изменении одной из скидок? Должны ли изменяться скидки при изменении цены? Если мы отвечаем на первый вопрос да , то, вероятно, требуем права создавать разрывы. Если у нас такие диапазоны скидок, как показано в табл. 7.2, то любая попытка изменить верхний предел первого диапазона должна сопровождаться изменением нижнего предела второго диапазона, чтобы не создавать разрыв или перекрытие. Таблица 7.2. Примерные ставки скидок
Мы предполагаем, что при нормальных обстоятельствах на все три вопроса будет дан ответ нет или не обязательно . Следовательно, эта модель почти наверняка неверна, и мы должны допустить, чтобы записи таблиц PRICES и DISCOUNTS были дочерними записями PRODUCTS. Это типичная особенность временных данных. Временные ряды, которые, на первый взгляд, кажутся дочерними рядами разных временных рядов, часто оказываются детьми тех же родителей. Осознание этого факта может существенно упростить обработку полученных в результате структур данных. Обработка еще упростится, если сделать так, чтобы все диапазоны скидок для данного товара имели одни и те же действительные даты. Полученная в результате модель данных показана на рис. 7.2, а определения таблиц приведены ниже. CREATE TABLE prices ( product code VARCHAR2(10) NOT NULL , date from DATE NOT NULL CONSTRANT prices df CHECK (date from = TRUNC(date from)) , date to DATE NOT NULL CONSTRANT prices dt CHECK (date to = TRUNC(date to)) , price NUMBER NOT NULL , CONSTRANT prices date range CHECK (date from <= date to) , CONSTRANT prices pk PRIMARY KEY {product code, date to) , CONSTRANT prices fk FOREIGN KEY {product code) REFERENCES (products) CREATE TABLE discount sets ( product code VARCHAR2(10) NOT NULL , date to DATE NOT NULL , CONSTRANT dislc set pk PRIMARY KEY (product code, date to) , CONSTRANT disk fk FOREIGN KEY (product code) REFERENCES (products) CREATE TABLE discounts ( product code VARCHAR2(10) NOT NULL , date to DATE NOT NULL qty from NUMBER(8,0) NOT NULL qty to NUMBER(8,0) NOT NULL discount pct NUMBER(2,2) NOT NULL CONSTRANT disk plc PRIMARY KEY {product code, date to, qty to) CONSTRANT disk fk FOREIGN KEY {product code, date to) REFERENCES (discount sets) CONSTRANT disk qty range CHECK (qty from <= qty to) PRODUCT : DISCOUNTSET? PRICEi DISCOUNT Puc. 7.2. Новый подход к скидкам Используя эту структуру, мы также избегаем проблемы поиска по двум диапазонам, поскольку для того, чтобы определить, какая скидка применима к конкретной строке заказа, мы должны сначала найти действующий набор скидок, а затем соответствующую запись о скидке. Предполагая, что у нас есть триггеры, предотвращающие появление разрывов и перекрытий, мы можем, модифицировав ранее использованный запрос, найти требуемую запись о ссылке. Рассмотрим следующий пример: /* Пример запроса на получение скидки, которая действует для количества :qty товара ;pcode, проданного :sdate */ SELECT discount pct FROM discount sets s , discounts d WHERE s.product code = :pcode AND s.date to >= .-sdate AND d.product code = s.product code AND d.date to = s.date to AND d.qty to >= :qty;
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |