Отчеты вашего начальника все еще не заслуживают доверия. Обнаружено, что атрибуты не именуются единообразно. Одной ошибкой используется атрибут, именуемый символьной строкой date_reported, а другой ошибкой атрибут именуется с помощью символьной строки report_date. Очевидно, что оба имени предназначены для представления одной и той же информации.
Как сосчитать ошибки по дате? Файл примера: V/anti/count.sql
SELECT date_reported, COUNT(*) AS bugs_per_date
FROM IssueAttr
FROM (SELECT DISTINCT issue_id, attr_value AS date_reported
WHERE attr_name4 IN<('date_reported', 'report_date')) GROUP BY date_reported;
Как узнать, хранится ли заданной ошибкой атрибут по еще одному имени? Как узнать, хранится ли ошибкой заданный атрибут дважды, под двумя разными именами? Как можно предотвратить подобные ошибки?
Одним из спасительных средств может быть объявление внешнего ключа по столбцу attrname для таблицы поиска, в которой содержатся одобренные имена атрибутов. Однако данным средством не поддерживаются атрибуты, определяемые на лету для каждого объекта. Все это присуще EAV-структуре.
Восстановление строки
Рассмотрим несложный пример извлечения из таблицы issues строки со всеми ее атрибутами, расположенными в столбцах. Требуется выбрать проблему в одной строке так, как если бы она хранилась в стандартной таблице.
issue_id date_reported status priority Description
1234 2009-06-01 NEW HIGH Сохранение не работает
В связи с тем, что каждый атрибут хранится в отдельной строке таблицы IssueAttributes, для извлечения их всех как части одной строки требуется объединение для каждого атрибута. На момент написания данного запроса необходимо знать все атрибуты. Следующий запрос позволяет восстановить строку, показанную выше:
Файл примера:.ЕА V/anti/reconstruct.sql
SELECT i.issue_id,
il.attr_value AS "date_reported",
i2.attr_value AS "status",
i3.attr_value AS "priority",
i4.attr_value AS "description"
FROM Issues AS i
LEFT OUTER JOIN IssueAttributes AS il
ON i.issue_id = il.issue_id AND il.attr_name = 1date_re-ported'
LEFT OUTER JOIN IssueAttributes AS i2
ON i.issue_id = i2.issue_id AND i2.attr_name = 'status'
LEFT OUTER JOIN IssueAttributes AS i3
ON i.issue_id = i3.issue_id AND i3.attr_name = 'priority1;
LEFT OUTER JOIN IssueAttributes AS i4
ON i.issue_id = i4.issue_id AND i4.attr_name = 'description' ;
WHERE i.issue_id = 1234;
Необходимо использовать внешние объединения, так как внутренние объединения приведут к тому, что запросом не будут возвращаться какие-либо строки, если в таблице IssueAttributes отсутствует какой-то из атрибутов. По мере увеличения числа атрибутов растет число объединений, и стоимость данного запроса возрастает экспоненциально.
Опубликовал vovan666
June 23 2013 16:13:23 ·
0 Комментариев ·
5080 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.