В качестве альтернативы взгляните на следующий запрос, использующий SQL-функцию COALESCE (). Данной функцией возвращается ее первый аргумент, отличный от NULL. Поскольку в запросе используется внешнее объединение, комментарий, принадлежащий запросу функции, у которого нет соответствующей строки в Bugs, все поля в Ь.* возвращаются как Null. Аналогичным образом, все поля в f .* будут Null, если комментарий относится к ошибке, а не к запросу функции. Перечислите поля, характерные для одной или другой родительской таблицы в простом виде. Если они не относятся к соответствующей родительской таблице, они возвращаются как
Null.
Файл npHMepa:_Polymorphic/soln/reverse-coalesce.sql <*
SELECT с.*,
COALESCE(b.issue_id, f.issue_id ) AS issue_id,
COALESCE(b.description, f.description ) AS
description,
COALESCE(b.reporter, f.reporter ) AS reporter,
COALESCE(b.priority, f.priority ) AS priority,
COALESCE(b.status, f.status ) AS status,
b.severity,
b.version_affected,
f.sponsor
FROM Comments AS с
LEFT OUTER JOIN (BugsComments JOIN Bugs AS b USING (issue_ id) )
USING (comment_id) LEFT OUTER JOIN (FeaturesComments JOIN FeatureRequests AS f USING (issue_id))
USING (comment_id) WHERE c.comment_id = 9876;
Оба запроса достаточно сложные, поэтому они хорошо подходят для просмотра базы данных, а в приложении их можно использовать в упрощенном виде.
Создание общей супертаблицы
В объектноориентированном полиморфизме ссылки на два подтипа могут осуществляться аналогичным образом, поскольку подтипами неявно совместно используется общий супертип. В SQL антипаттерн Полиморфные ассоциации не учитывает такой важный объект, как общий супертип. Данный недостаток можно исправить путем создания базовой таблицы, которую расширяют все родительские таблицы (см. «Наследование таблицы классов»). Добавьте внешний ключ в дочернюю таблицу Comments, чтобы ссылаться на базовую таблицу. Столбец issuetype не требуется. Данное решение иллюстрируется схемой взаимосвязей объектов.
Опубликовал vovan666
July 03 2013 10:34:32 ·
0 Комментариев ·
3179 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.