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

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

Apr 15, 2017

Download

Documents

CS Center
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Базы данных, autumn 2016: Хорошая и плохая схемы

...

.

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

.

...

.

...

.

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

Computer Science Center

15 сентября 2015

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

...

.

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

.

...

.

...

.

Несомненное зло1

PaperTitle AuthorsThree favorite results J.WidomHelP: High-level… J.Widom,S.Salihoglu

1в хранимых таблицах

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

...

.

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

.

...

.

...

.

Что делать?

▶ Зла лучше не допускать

▶ Но если уж оно случилось, то делать что-то надо

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

...

.

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

.

...

.

...

.

Что делать?

▶ Зла лучше не допускать▶ Но если уж оно случилось, то делать что-то надо

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

...

.

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

.

...

.

...

.

LIKE2

Простейший поиск по шаблону, является частьюстандарта SQL и поддерживается всемиприличными СУБД

SELECT * FROM PaperWHERE authors LIKE ’%J_Widom%’

▶ Ищет совпадение всей строки, возвращаетбулевское значение

▶ Метасимволы: _ обозначает любой символ, %последовательность любых символов

2нет, не тот лайк

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

...

.

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

.

...

.

...

.

LIKE

LIKE можно при желании может сделать многое

SELECT * FROMPaper P,(SELECT unnest(ARRAY[’SIGMOD’, ’DBLP’])

AS conf_name)AS C

WHERE P.conference LIKE ’%’ || C.conf_name || ’%’

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

...

.

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

.

...

.

...

.

Не LIKE

Многое, но не всё. Как найти только Widom и ненайти Widome?

SELECT * FROM PaperWHERE authors LIKE ’%Widom%’

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

...

.

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

.

...

.

...

.

Регулярные выражения

Нестандартный синтаксис PostgreSQL

SELECT * FROM PaperWHERE authors ~ ’Widom\s*(,.*)?$’;

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

...

.

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

.

...

.

...

.

Регулярные выражения

Стандартный синтаксис SQL

SELECT * FROM PaperWHERE authors SIMILAR TO ’_*Widom *(,_*)?’;

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

...

.

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

.

...

.

...

.

Операции с массивами

Вместо попыток найти разделители вокруг искомойподстроки разобьём всю строку разделителями

-- авторов больше одногоSELECT * FROM Paper WHEREarray_length(string_to_array(authors, ’,’), 1) > 1;

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

...

.

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

.

...

.

...

.

Операции с массивами

-- Первый автор похож на WidomSELECT * FROM PaperWHERE (string_to_array(authors, ’,’))[1]

LIKE ’%Widom’;

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

...

.

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

.

...

.

...

.

Какой-нибудь элемент, удовлетворяющийусловию

Что если нам все равно, какое место у J.Widom,лишь бы она была в массиве?SELECT * FROM PaperWHERE ’J.Widom’ =

ANY(string_to_array(authors, ’,’));

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

...

.

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

.

...

.

...

.

Множественные операции с массивами

-- Тест подмножестваSELECT * FROM PaperWHERE ARRAY[’J.Widom’]

<@ (string_to_array(authors, ’,’));

-- Тест пересеченияSELECT * FROM PaperWHERE ARRAY[’J.Widom’, ’А.Выбегалло’]

&& (string_to_array(authors, ’,’));

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

...

.

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

.

...

.

...

.

Первый запрос

Для заданного университета вернет названиястатей, в авторы которых входят ученые этогоуниверситета-- Без соединенийSELECT * FROM PaperWHERE (SELECT ARRAY(SELECT name

FROM ResearcherWHERE university=’Stanford’))

&& string_to_array(authors, ’,’);

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

...

.

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

.

...

.

...

.

Первый запрос

Для заданного университета вернет названиястатей, в авторы которых входят ученые этогоуниверситета-- С соединениямиSELECT * FROM Paper JOIN Researcher

ON (name = ANY(string_to_array(authors, ’,’)))WHERE university=’Stanford’;

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

...

.

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

.

...

.

...

.

Что делать?

Зла лучше не допускать

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

...

.

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

.

...

.

...

.

Фундаментальная проблема

В строке таблицы Paper записано много фактов▶ что статья подана на конференцию и принятаили не принята

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

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

...

.

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

.

...

.

...

.

Что делать?

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

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

...

.

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

.

...

.

...

.

Что делать?

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

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

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

...

.

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

.

...

.

...

.

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

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

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

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

...

.

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

.

...

.

...

.

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

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

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