База данных Oracle, условный столбец - PullRequest
1 голос
/ 15 октября 2019

Я не уверен, откуда начать решать эту проблему.

У меня огромная таблица, по крайней мере, сотни тысяч строк.

Один из столбцов должен быть ценой, нов валюте клиента. Доступные данные:

  1. Данные о ценах в EUR
  2. Пакет с функцией получения обменного курса

Конечно, курсы обмена будут обновляться часто и при первом получениистрока, затем проверка, использует ли клиент EUR, а если нет, выполнение другой выборки для информации о ставке кажется плохой идеей.

Также многие клиенты будут использовать EUR, поэтому всегда проверка курса с использованием одного и того же запроса может привести кбесполезные накладные расходы.

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

Вторая идея заключалась в том, чтобы сделать таблицу с правильной ценой в валюте клиента для начала. Может быть, с помощью функции Oracle (которая у меня уже есть)

Я думаю, второй способ - это «более правильная» реализация, но я не знаю, как использовать функцию пакета, чтобы получить один столбец.

Есть ли лучший способ, или я должен пойти с одним из них?

Ответы [ 3 ]

1 голос
/ 15 октября 2019

Создание представления не является плохим вызовом, но вы должны понимать, что на самом деле это просто заголовок, поэтому запрос там будет выполняться каждый раз, когда вызывается значение, поэтому я не уверен, что это именно то, что вам нужно.

, что вы можете сделать, это создать materialized view для всех значений во всех валютах, используя функцию, правильно индексировать ее для быстрого поиска и обновлять каждый раз, когда ваши ставки меняются (сомневаюсь, что они будут меняться каждые 15 минут) - для материализованногопросмотр обновлений будет выполняться автоматически, если установлен этот способ.

1 голос
/ 15 октября 2019

Виртуальная колонка приходит на помощь. Обратите внимание, что виртуальные столбцы существуют начиная с Oracle 11g.

Просто добавьте формулу, определяющую вычисление в качестве виртуального столбца, как в примере ниже.

alter table price add
( home_price     NUMBER GENERATED ALWAYS AS 
(case when currency  = 'USD' then price
else price * convert_rate('EUR','USD') end) VIRTUAL
);

Обратите внимание, чтоТребуется, чтобы функция преобразования тарифов была отклонена как DETERMINISTIC.

. Вот полный пример преобразования EUR в домашний тариф из UDS

*. 1018 *
1 голос
/ 15 октября 2019

Как вы сказали, что обменные курсы часто обновляются, и вам всегда будут нужны обновленные значения валют, поэтому я предлагаю создать VIEW и использовать его в качестве таблицы везде, где вам нужно в вашем приложении.

create or replace view your_view_name as
select <column_list>, 
case when currency = 'EUR' then price else price*conversion_rate end as price
from <both of your tables with join>

Ура !!

...