...
.
...........................
.
...
.
...
.
Нормализация и денормализацияКурс «Базы Данных»
Computer Science Center
15 сентября 2015
...
.
...........................
.
...
.
...
.
Несомненное зло1
PaperTitle AuthorsThree favorite results J.WidomHelP: High-level… J.Widom,S.Salihoglu
1в хранимых таблицах
...
.
...........................
.
...
.
...
.
Что делать?
▶ Зла лучше не допускать
▶ Но если уж оно случилось, то делать что-то надо
...
.
...........................
.
...
.
...
.
Что делать?
▶ Зла лучше не допускать▶ Но если уж оно случилось, то делать что-то надо
...
.
...........................
.
...
.
...
.
LIKE2
Простейший поиск по шаблону, является частьюстандарта SQL и поддерживается всемиприличными СУБД
SELECT * FROM PaperWHERE authors LIKE ’%J_Widom%’
▶ Ищет совпадение всей строки, возвращаетбулевское значение
▶ Метасимволы: _ обозначает любой символ, %последовательность любых символов
2нет, не тот лайк
...
.
...........................
.
...
.
...
.
LIKE
LIKE можно при желании может сделать многое
SELECT * FROMPaper P,(SELECT unnest(ARRAY[’SIGMOD’, ’DBLP’])
AS conf_name)AS C
WHERE P.conference LIKE ’%’ || C.conf_name || ’%’
...
.
...........................
.
...
.
...
.
Не LIKE
Многое, но не всё. Как найти только Widom и ненайти Widome?
SELECT * FROM PaperWHERE authors LIKE ’%Widom%’
...
.
...........................
.
...
.
...
.
Регулярные выражения
Нестандартный синтаксис PostgreSQL
SELECT * FROM PaperWHERE authors ~ ’Widom\s*(,.*)?$’;
...
.
...........................
.
...
.
...
.
Регулярные выражения
Стандартный синтаксис SQL
SELECT * FROM PaperWHERE authors SIMILAR TO ’_*Widom *(,_*)?’;
...
.
...........................
.
...
.
...
.
Операции с массивами
Вместо попыток найти разделители вокруг искомойподстроки разобьём всю строку разделителями
-- авторов больше одногоSELECT * FROM Paper WHEREarray_length(string_to_array(authors, ’,’), 1) > 1;
...
.
...........................
.
...
.
...
.
Операции с массивами
-- Первый автор похож на WidomSELECT * FROM PaperWHERE (string_to_array(authors, ’,’))[1]
LIKE ’%Widom’;
...
.
...........................
.
...
.
...
.
Какой-нибудь элемент, удовлетворяющийусловию
Что если нам все равно, какое место у J.Widom,лишь бы она была в массиве?SELECT * FROM PaperWHERE ’J.Widom’ =
ANY(string_to_array(authors, ’,’));
...
.
...........................
.
...
.
...
.
Множественные операции с массивами
-- Тест подмножестваSELECT * FROM PaperWHERE ARRAY[’J.Widom’]
<@ (string_to_array(authors, ’,’));
-- Тест пересеченияSELECT * FROM PaperWHERE ARRAY[’J.Widom’, ’А.Выбегалло’]
&& (string_to_array(authors, ’,’));
...
.
...........................
.
...
.
...
.
Первый запрос
Для заданного университета вернет названиястатей, в авторы которых входят ученые этогоуниверситета-- Без соединенийSELECT * FROM PaperWHERE (SELECT ARRAY(SELECT name
FROM ResearcherWHERE university=’Stanford’))
&& string_to_array(authors, ’,’);
...
.
...........................
.
...
.
...
.
Первый запрос
Для заданного университета вернет названиястатей, в авторы которых входят ученые этогоуниверситета-- С соединениямиSELECT * FROM Paper JOIN Researcher
ON (name = ANY(string_to_array(authors, ’,’)))WHERE university=’Stanford’;
...
.
...........................
.
...
.
...
.
Фундаментальная проблема
В строке таблицы Paper записано много фактов▶ что статья подана на конференцию и принятаили не принята
▶ что конференция проходит в каком-то месте▶ что некоторое множество исследователейявляется авторами
...
.
...........................
.
...
.
...
.
Что делать?
Одна строка – один факт
куда лишние факты то девать?
...
.
...........................
.
...
.
...
.
Декомпозиция
▶ Лишние факты надо отселять в их собственныетаблицы
▶ Но делать это надо не абы как