Oracle Data Versioning / Стратегии секционирования / Лучшие практики - PullRequest
1 голос
/ 22 января 2010

не уверен, что объект полностью передает то, чего я пытаюсь достичь, но позвольте мне объяснить:

Мы создаем приложение, которое использует Oracle в качестве внутреннего хранилища. Каждый год набор данных за прошлые годы будет «архивироваться», а новый экземпляр создается и заполняется с нуля. Какие есть варианты сделать это в одной и той же схеме?

  1. Храните информацию о версии на рекордном уровне (мы предполагаем, что это будет слишком медленно для нашего варианта использования).
  2. Храните информацию о версии на уровне таблицы, поэтому для каждой новой версии мы будем заново создавать все таблицы, но с префиксом новой версии. (Нам нравится это решение, так как мы можем делать все это в коде).

Нет ли что-то вроде разделов / личностей / пространств имен, которые позволили бы нам достичь этого в Oracle?

Мой опыт оракула довольно ограничен, любая помощь будет принята с благодарностью!

Ответы [ 4 ]

1 голос
/ 22 января 2010

Концептуальная модель RDBMS не очень хороша для поддержки временных версий данных. Так что в этом отношении не только Oracle.

Мне неясно, почему вы думаете, что хранение информации о версии на рекордном уровне будет слишком медленным. Слишком медленно в создании новой версии? Или слишком медленно, когда дело доходит до извлечения данных во время обычных операций?

Вот как ты мог это сделать. Учитывая таблицу CUSTOMERS с бизнес-ключом CUSTOMER_REF, я мог бы, как правило, построить ее следующим образом (я использую сокращенный синтаксис, а не передовой опыт из-за недостатка места):

create table customers 
( id number not null primary key
  , customer_ref number not null unique key
  , name varchar2(30) not null )
/

Версионный эквивалент будет выглядеть так:

create table customers 
( id number not null primary key
  , customer_ref number not null 
  , version_number number
  , name varchar2(30) not null
  , constraint whatever unique (customer_ref, version_number) )
/

Это работает, сохраняя текущую версию VERSION_NUMBER нулевой, и заполняя ее только во время архивирования. Любой поиск должен включать and version_number is null. Это будет немного болезненно, и вам может понадобиться включить столбец в любые дополнительные индексы, которые вы создаете.

Очевидно, что поддержание всех версий записей в одной таблице приведет к увеличению размера ваших таблиц, что может повлиять на производительность. Опция Oracle Partitioning может определенно помочь здесь. Это также даст вам аккуратный способ создания набора данных следующего года. Тем не менее, это дополнение к корпоративной лицензии за дополнительную плату, поэтому это дорогой вариант. Узнайте больше. .

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

Если подумать об этом, отдельные таблицы для каждой версии кажутся очень привлекательными. Для простоты использования я бы оставил текущую версию без префикса, чтобы архивирование стало просто процессом

create table customers_n as select * from customers; 

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

Одним из важных преимуществ нескольких таблиц (и разбиения) является то, что вы можете перемещать архивированные записи в табличное пространство READ ONLY. Это не только предохраняет их от нежелательных изменений, но также означает, что вы можете исключить их из последующих резервных копий.

редактировать

Я заметил, что вы прокомментировали, что архивные данные могут периодически изменяться. В этом случае перемещение его в табличные пространства READ ONLY не является правильным.

0 голосов
/ 05 мая 2016

1) Интервал разбить его на год и поле даты в строке.

2) Добавьте его в конец каждой таблицы и заполните его последовательностью и триггером.

3) Затем разбить на интервал года в этом столбце.

0 голосов
/ 23 января 2010

Возможно изменение схемы между годами. Например, в 2010 году у вас есть пятнадцать столбцов, а в 2011 году вы добавите шестнадцатый. Если да, будет ли одно и то же приложение работать с данными за 2010 и 2011 годы.

Если схема статическая, я бы пошел к таблице со столбцом «ГОД» и использовал бы VPD / RLS / FGAC , чтобы применить предикат YEAR = «2010».

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

0 голосов
/ 23 января 2010

Единственное, что я добавлю к тому, что сказал APC, касается вашего запроса о "пространствах имен".

Пространство имен в Oracle - это схема, в которой вы можете иметь одинаковые имена объектов в каждой схеме.

Конечно, все зависит от того, как ваше приложение должно получать доступ к нескольким версиям, но я бы предпочел использовать разные схемы для каждого года, прежде чем использовать какое-то соглашение об именах для поддержки версий таблиц в одной и той же схеме. Причина в том, что со временем у вас будут кошмары. По крайней мере, для разных схем все DDL могут быть одинаковыми, все ссылки на объекты будут одинаковыми, а инструменты, такие как моделировщики ER и инструменты запросов, будут работать в контексте этой схемы. Модели данных изменяются, поэтому в какой-то момент вам может понадобиться запустить некоторые инструменты сравнения, и если все ваши таблицы будут названы фанки с каким-то постфиксом версии, это не сработает.

Добавить схему можно быстро скопировать / переместить с помощью экспорта или перекачки данных с помощью параметров fromuser / touser или remap_schema, поэтому вам не понадобится много кода, кроме как для очистки данных прошлых лет из новой версии.

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

...