21
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Нормализация и денормализация Курс «Базы Данных» Computer Science Center 15 сентября 2015

Базы данных, autumn 2016: Хорошая и плохая схемы

Embed Size (px)

Citation preview

...

.

...........................

.

...

.

...

.

Нормализация и денормализацияКурс «Базы Данных»

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 записано много фактов▶ что статья подана на конференцию и принятаили не принята

▶ что конференция проходит в каком-то месте▶ что некоторое множество исследователейявляется авторами

...

.

...........................

.

...

.

...

.

Что делать?

Одна строка – один факт

...

.

...........................

.

...

.

...

.

Что делать?

Одна строка – один факт

куда лишние факты то девать?

...

.

...........................

.

...

.

...

.

Декомпозиция

▶ Лишние факты надо отселять в их собственныетаблицы

▶ Но делать это надо не абы как

...

.

...........................

.

...

.

...

.

Декомпозиция

▶ Лишние факты надо отселять в их собственныетаблицы

▶ Но делать это надо не абы как