Классика баз данных - статьи

       

Программный компромисс относительно иерархий типов


Реализация наследования в Oracle без сомнения значительно улучшает полезность и мощность объектных типов в языке PL/SQL. Означает ли это, что многие и многие разработчики PL/SQL будут теперь использовать преимущества объектных типов и, в частности, эти замечательные новые возможности? У меня есть сомнения на этот счет, и на это - две причины:

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

Во-вторых, без сомнения, работа с объектной моделью включает написание более сложного кода. Вам придется иметь дело с конструкторами, и другими специальными операторами, типа TREAT, FINAL, SUBSTITUTABLE, и так далее. Вы можете потратить немало времени, чтобы стать профессионалом во всем этом, и потом все же перестать писать код, который является достаточно трудным для понимания и управления.

Итак, прежде всего, рассмотрите, что вам могут дать иерархии объектных типов. Возможно, вы обнаружите, что объектные типы прекрасно вам подходят и имеют важные преимущества. В таком случае, глубоко изучите эти возможности и обеспечьте их использование во всей их мощности. Если вы не видите в этом ничего хорошего, не расстраивайтесь. Просто оставайтесь со своими реляционными таблицами и более простыми структурами данных. Они работали на протяжении 25 лет (юбилей, который Oracle сейчас отмечает); и, вероятно, будут хороши в течение еще долгого времени.

Листинг 1. Попытка указать два приема пищи.

BEGIN INSERT INTO meal VALUES ( SYSDATE, food_t ('Shrimp cocktail', 'PROTEIN', 'Ocean'), food_t ('Eggs benedict', 'PROTEIN', 'Farm'), dessert_t ('Strawberries and cream', 'FRUIT', 'Backyard', 'N', 2001)); INSERT INTO meal VALUES ( SYSDATE + 1, dessert_t ('Strawberries and cream', 'FRUIT', 'Backyard', 'N', 2001), food_t ('Eggs benedict', 'PROTEIN', 'Farm'), cake_t ('Apple Pie', 'FRUIT', 'Baker''s Square', 'N', 2001, 8, NULL)); END;


Листинг 2. Ограничение подставляемости в объектной таблице

SQL> CREATE TABLE brunches OF food_t NOT SUBSTITUTABLE AT ALL LEVELS; Table created. SQL> SQL> INSERT INTO brunches VALUES ( 2 food_t ('Eggs benedict', 'PROTEIN', 'Farm')); 1 row created. SQL> INSERT INTO brunches VALUES ( 2 dessert_t ('Strawberries and cream', 'FRUIT', 'Backyard', 'N', 2001)); dessert_t ('Strawberries and cream', 'FRUIT', 'Backyard', 'N', 2001)) * ERROR at line 2: ORA-00932: inconsistent datatypes

Листинг 3. Вставка записей в таблицу meal.

BEGIN -- Заполнение таблицы meal INSERT INTO meal VALUES ( SYSDATE, food_t ('Shrimp cocktail', 'PROTEIN', 'Ocean'), food_t ('Eggs benedict', 'PROTEIN', 'Farm'), dessert_t ('Strawberries and cream', 'FRUIT', 'Backyard', 'N', 2001)); INSERT INTO meal VALUES ( SYSDATE + 1, food_t ('Shrimp cocktail', 'PROTEIN', 'Ocean'), food_t ('Stir fry tofu', 'PROTEIN', 'Vat'), cake_t ('Apple Pie', 'FRUIT', 'Baker''s Square', 'N', 2001, 8, NULL)); INSERT INTO meal VALUES ( SYSDATE + 1, food_t ('Fried Calamari', 'PROTEIN', 'Ocean'), -- Butter cookies for dinner? Yikes! dessert_t ('Butter cookie', 'CARBOHYDRATE', 'Oven', 'N', 2001), cake_t ('French Silk Pie', 'CARBOHYDRATE', 'Baker''s Square', 'Y', 2001, 6, 'To My Favorite Frenchman')); END; /

Листинг 4. Использование оператора TREAT.

SQL> SELECT TREAT (main_course AS dessert_t).contains_chocolate chocolatey 2 FROM meal 3 WHERE TREAT (main_course AS dessert_t) IS NOT NULL; CHOCOLATEY --------------- N


Содержание раздела