Как автоматически отобразить таблицы поиска в базе данных при вставке (Oracle) - PullRequest
1 голос
/ 15 июля 2011

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

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

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

1 Ответ

7 голосов
/ 15 июля 2011

В общем случае вы можете сделать свои изменения прозрачными для пользователей, если сможете создавать обновляемые представления.

  1. Нормализация базовой таблицы на 3NF, BCNF или 5NF.
  2. Переименование исходной базовой таблицы.
  3. Создание обновляемого представления с тем же именем, столбцыи строки как исходная денормализованная базовая таблица.
  4. Убедитесь, что разрешения для нового представления соответствуют разрешениям для исходной базовой таблицы.
  5. Test.
  6. Повтордо завершения.

Любое клиентское программное обеспечение, которое пытается ВЫБРАТЬ, ВСТАВИТЬ, ОБНОВИТЬ или УДАЛИТЬ исходную базовую таблицу, вместо этого попадет в обновляемое представление.(Это потому, что таблицы и представления совместно используют пространство имен, и это не случайность.) DBMS и ваш вспомогательный код обеспечат правильную работу.

В зависимости от вашей платформы и декомпозиции, создание обновляемого представления может быть простым и невозможным.В Oracle, я думаю, в худшем случае вам придется написать триггеры INSTEAD OF для поддержки всех операций запроса.Это не так уж плохо.

Но, основываясь на нескольких месяцах, проведенных на SO, я должен сказать, что не уверен на 100%, что вам действительно нужно это делать, или что вы действительно хотите это сделать.Опубликуйте DDL и репрезентативные данные ваших таблиц в виде операторов SQL INSERT, и мы сможем предложить более конкретные предложения.

...