В качестве альтернативы взгляните на следующий запрос, использующий 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 не требуется. Данное решение иллюстрируется схемой взаимосвязей объектов. |