Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
conspect.pdf
Скачиваний:
374
Добавлен:
17.03.2016
Размер:
27.86 Mб
Скачать

Базы данных

БГУИР, ПОИТ

 

 

4.3. Проектирование БД на даталогическом уровне

Вспомним определение даталогического уровня моделирования.

После того, как все высокоуровневые требования, отражённые на модели инфологического уровня, согласованы с заказчиком, имеет смысл приступить к созданию проекции инфологической модели на даталогический уровень, т.е. описать модель в терминах определённого вида БД, или даже в синтаксисе конкретной СУБД.

Но перед тем, как создавать модель, необходимо ещё раз проанализировать имеющуюся инфологическую модель: на этот раз мы будем анализировать её с точки зрения «как реализовать это в виде БД», оставляя важные для проектирования БД и создания кода приложения комментарии.

Для удобства оформим нашу работу в виде таблицы. И, прежде чем приступать к работе, примем несколько соглашений, распространяющихся на всю работу по созданию даталогической модели:

В таблице с описанием таблиц и полей БД тип данных указывается явно, если из названия полей и здравого смысла не очевидно, что нужно использовать «обычные» текстовые или числовые типы данных.

Все типы данных при создании полей таблиц БД формируются из расчёта совместимости с MySQL версии 5.5 и выше.

При именовании таблиц и полей используется ТОЛЬКО нижний регистр.

Слова в именах таблиц и полей отделены друг от друга символом «_».

В именах таблиц существительные используются в единственном числе (file, а не files). В именах полей допускается множественное число.

Имена полей начинаются с префиксов из первых букв названия таблицы.

Все поля, содержащие дату и/или время, имеют тип INTEGER и хранят

UNIXTIME-значения.

Стр: 77/248

Базы данных

 

 

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица

Поле

Тип

 

Комментарий

 

Категории фай-

Идентификатор категории

 

 

 

 

лов

Название категории

 

 

 

 

 

Возрастные ограничения

 

 

 

 

 

(ссылка)

 

 

 

 

Файлы на серве-

Идентификатор файла

UNSIGNED BIGINT

 

 

 

ре

Идентификатор категории, к

 

 

 

 

 

которой относится файл

 

 

 

 

 

(ссылка)

 

 

 

 

 

Размер (в байтах)

 

 

 

 

 

Дата добавления

 

 

 

 

 

Срок хранения (до какой даты

 

 

 

 

 

и какого времени)

 

 

 

 

 

Исходное имя (без расшире-

 

 

 

 

 

ния)

 

 

 

 

 

Исходное расширение

 

 

 

 

 

Имя на сервере (хэш)

 

 

 

 

 

Контрольная сумма (sha1-

 

 

 

 

 

хэш)

 

 

 

 

 

Параметры доступа (ссылка)

 

 

 

 

 

Количество скачиваний фай-

 

 

 

 

 

ла

 

 

 

 

 

Возрастные ограничения

 

 

 

 

 

(ссылка)

 

 

 

 

 

Ссылка на удаление (для не-

 

 

 

 

 

зарегистрированных пользо-

 

 

 

 

 

вателей)

 

 

 

 

Параметры до-

Идентификатор параметра

 

 

 

 

ступа к файлу

Наименование параметра

 

 

 

 

 

Описание параметра

 

 

 

 

 

Создан пользователем

 

 

Признак того, что

 

 

 

 

 

данный параметр не

 

 

 

 

 

является «встроен-

 

 

 

 

 

ным», а создан

 

 

 

 

 

пользователем

 

Возрастные

Идентификатор ограничения

 

 

 

 

ограничения

Минимальный возраст (в го-

 

 

 

 

 

дах)

 

 

 

 

 

Название ограничения

 

 

 

 

 

Описание ограничения

 

 

 

 

Комментарии

Идентификатор комментария

UNSIGNED BIGINT

 

 

 

(плоская структу-

К какому файлу (ссылка)

 

 

 

 

ра, т.е. нельзя

Текст комментария

 

 

 

 

комментировать

Кто оставил комментарий

 

 

 

 

комментарии)

(ссылка)

 

 

 

 

 

Дата и время добавления

 

 

 

 

 

комментария

 

 

 

 

 

Выставленная оценка

 

 

комментируя файл,

 

 

 

 

 

можно не только

 

 

 

 

 

писать текст, но и

 

 

 

 

 

выставлять файлу

 

 

 

 

 

оценку

 

Пользователи

Идентификатор пользователя

UNSIGNED BIGINT

 

 

 

 

Логин

 

 

 

 

 

Пароль

 

 

 

 

 

E-mail

 

 

 

 

 

Дата и время регистрации

 

 

 

 

 

Дата рождения

 

 

 

 

 

Сколько файлов пользова-

 

 

Кэшируется из зака-

 

 

тель закачал

 

 

чек.

 

Стр: 78/248

Базы данных

 

 

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сколько файлов пользова-

 

 

Кэшируется из ска-

 

 

тель скачал

 

 

чанного.

 

 

Сколько комментариев оста-

 

 

Кэшируется из ком-

 

 

вил пользователь

 

 

ментариев.

 

 

Бонус по скорости

 

 

 

 

 

Бонус по количеству закачи-

 

 

 

 

 

ваемого

 

 

 

 

 

Бонус по количеству скачива-

 

 

 

 

 

емого

 

 

 

 

 

Бан (ссылка)

 

 

(ссылка на причину

 

 

 

 

 

бана; NULL – если

 

 

 

 

 

не забанен)

 

 

До какой даты и какого вре-

 

 

(NULL – если не за-

 

 

мени забанен

 

 

банен)

 

Роли (пользова-

Идентификатор роли

 

 

 

 

тель может

Название роли

 

 

 

 

находиться в не-

Ограничения по объёму зака-

 

 

 

 

скольких ролях)

чиваемых файлов

 

 

 

 

Права ролей

Ограничения по объёму ска-

 

 

 

 

(правами обла-

чиваемых файлов

 

 

 

 

дают только ро-

Ограничения по количеству

 

 

 

 

ли, напрямую

закачиваемых файлов

 

 

 

 

пользователям

Ограничения по количеству

 

 

 

 

права давать

 

 

 

 

скачиваемых файлов

 

 

 

 

нельзя)

 

 

 

 

Ограничения по скорости

 

 

 

 

 

 

 

 

 

 

скачивания

 

 

 

 

 

Идентификатор права

 

 

 

 

 

Название права

 

 

 

 

 

Описание права

 

 

 

 

Файлы, закачан-

Идентификатор пользователя

 

 

Объединение двух

 

ные или скачан-

Идентификатор файла

 

 

исходных отноше-

 

ные данным

 

 

 

ний («Файлы, зака-

 

пользователем

 

 

 

чанные данным

 

 

 

 

 

пользователем» и

 

 

 

 

 

«Файлы, скачанные

 

 

 

 

 

данным пользова-

 

 

 

 

 

телем»)

 

Лог (хранит дей-

Идентификатор записи лога

UNSIGNED BIGINT

 

 

 

ствия за послед-

Идентификатор пользователя

 

 

NULL, если это си-

 

ний месяц, потом

(ссылка)

 

 

стемное действие

 

они переносятся

Идентификатор действия

 

 

Ссылка на таблицу

 

в архив лога)

(ссылка)

 

 

прав.

 

 

Идентификатор файла (ссыл-

 

 

NULL, если опера-

 

 

ка)

 

 

ция не связана с

 

 

 

 

 

файлами

 

 

Дата и время выполнения

 

 

 

 

 

действия

 

 

 

 

 

Параметры действия

 

 

Сериализованный

 

 

 

 

 

массив.

 

Архив лога

Идентификатор записи лога

255-разрядное 36-

 

Очень сильно поду-

 

 

 

ричное

 

мать о том, как это

 

 

 

автоинкрементируемое

реализовать: триг-

 

 

 

число

 

гером, хранимой

 

 

 

 

 

процедурой, на

 

 

 

 

 

уровне приложения

 

 

 

 

 

и т.п.

 

 

Идентификатор пользователя

 

 

NULL, если это си-

 

 

(ссылка)

 

 

стемное действие

 

 

Идентификатор действия

 

 

Ссылка на таблицу

 

 

(ссылка)

 

 

прав.

 

 

Идентификатор файла (ссыл-

 

 

NULL, если опера-

 

Стр: 79/248

Базы данных

 

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

 

ка)

 

ция не связана с

 

 

 

 

файлами

 

 

Дата и время выполнения

 

 

 

 

действия

 

 

 

 

Параметры действия

 

Сериализованный

 

 

 

 

массив.

 

Чёрный список

IP-адрес в формате IPv4

 

 

 

IP-адресов

IP-адрес в формате IPv6

 

 

 

 

Дата и время, до которых

 

 

 

 

действительна блокировка

 

 

 

 

Причина блокировки (ссылка)

 

 

 

Причины блоки-

Идентификатор причины

 

 

 

ровок

Название причины

 

 

 

 

Описание причины

 

 

 

Страницы сайта

Идентификатор страницы

 

 

 

 

Ссылка на родительскую

 

 

 

 

страницу

 

 

 

 

Название страницы (для

 

 

 

 

отображения на самой стра-

 

 

 

 

нице)

 

 

 

 

Имя страницы в меню и на

 

 

 

 

карте сайта

 

 

 

 

Заглавие страницы (HTML-тег

 

 

 

 

TITLE)

 

 

 

 

Ключевые слова (HTML-тег

 

 

 

 

meta … keywords)

 

 

 

 

Описание страницы (HTML-

 

 

 

 

тег meta … description)

 

 

 

 

Текстовое наполнение стра-

 

 

 

 

ницы

 

 

 

 

Основной шаблон страницы

 

 

 

 

Основной обработчик стра-

 

 

 

 

ницы

 

 

 

Ссылки на скачи-

Идентификатор ссылки

 

 

 

вание файлов

Идентификатор файла (ссыл-

 

 

 

 

ка)

 

 

 

 

Ссылка (sha1-хэш)

 

хэш, 240 символов,

 

 

 

 

6 sha1

 

 

Срок действия ссылки (дата и

 

 

 

 

время, после которых ссылка

 

 

 

 

считается недействительной)

 

 

 

 

IP-адрес, для которого дей-

 

Эти два поля не мо-

 

 

ствительна ссылка (в форма-

 

гут одновременно

 

 

те IPv4)

 

быть NULL (сделать

 

 

IP-адрес, для которого дей-

 

триггер для провер-

 

 

ствительна ссылка (в форма-

 

ки).

 

 

те IPv6)

 

 

 

 

Хэш для размещения в cookie

 

Хэш ссылки и

 

 

(для дополнительной защи-

 

cookie-хэш НЕ

 

 

ты; не должен совпадать с

 

ДОЛЖНЫ СОВПА-

 

 

хэшем самой ссылки

 

ДАТЬ! Продумать

 

 

 

 

реализацию

 

 

 

 

(видимо, триггером).

 

 

Пароль на скачивание

 

 

 

Интенсивность

Идентификатор скачивания

 

 

 

скачиваний

Идентификатор ссылки на

 

 

 

 

скачивание (ссылка)

 

 

 

 

Дата и время, когда было

 

 

 

 

произведено скачивание

 

 

 

Информация о

Всего зарегистрированных

 

Хорошо продумать

 

ресурсе (все по-

пользователей

 

обеспечение конси-

 

Стр: 80/248

Базы данных

 

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

ля кэшируются

 

 

стентности данных!

 

на основе агре-

Пользователей зарегистри-

 

 

 

гирования дан-

ровалось сегодня

 

 

 

ных из других

Всего закачано файлов

 

 

 

таблиц):

Файлов закачано сегодня

 

 

 

 

Общий объём закачанных

 

 

 

 

файлов

 

 

 

 

Объём файлов, закачанных

 

 

 

 

сегодня

 

 

 

 

Всего скачано файлов

 

 

 

 

Файлов скачано сегодня

 

 

 

 

Общий объём скачанных

 

 

 

 

файлов

 

 

 

 

Объём файлов, скачанных

 

 

 

 

сегодня

 

 

 

Группы пользо-

Идентификатор группы

 

 

 

вателей

Владелец (создатель) группы

 

 

 

 

(ссылка)

 

 

 

 

Название группы

 

 

 

 

Описание группы

 

 

 

Несмотря на то, что вышеприведённая таблица не слишком сильно отличается от ранее показанного списка сущностей и атрибутов, она может понадобиться при подробном документировании проекта (когда типы данных и комментарии будут прописаны подробно по всем полям всех таблиц).

Поскольку в реальности гораздо удобнее хранить описания и графическое представление в едином файле, НАСТОЯТЕЛЬНО рекомендуется писать комментарии ко ВСЕМ таблицам и ВСЕМ полям, даже ЕСЛИ сейчас вам что-то кажется понятным и самоочевидным: через некоторое время вы что-то забудете, и понятным и очевидным оно не будет уже и для вас. А для тех, кто впервые видит модель БД, уже сейчас там много непонятного и неочевидного.

Итак, представим нашу модель графически, а затем дадим необходимые пояснения.

Как и в случае инфологического моделирования, модель получилась достаточно объёмной, а потому «на одной картинке» она сложно читается. Но один факт можно заметить сразу: таблиц в БД больше (22), чем изначально было выделено сущностей (19). Это связано с тем, что даталогический уровень уже содержит таблицы для связей «многие ко многим», а также отражает результат нормализации и иных форм адаптации модели предметной области к реальности (в т.ч. адаптации к требованию удобства использования при написании кода приложения).

Стр: 81/248

Базы данных

БГУИР, ПОИТ

 

 

Снова обратимся к табличному представлению и прокомментируем особенности той или иной таблицы БД.

 

Исходная таблица

Таблица БД

Комментарии

 

 

Категории файлов

 

Категории файлов. Напри-

 

 

 

 

мер, "Музыка", "Видео",

 

 

 

 

"Программы" и т.п.

 

 

 

 

 

 

 

 

 

 

 

Стр: 82/248

Базы данных

 

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

Файлы на сервере

 

Одна из основных, наибо-

 

 

 

лее часто используемых

 

 

 

таблиц.

 

 

 

Максимально продумать

 

 

 

оптимизацию произво-

 

 

 

дительности!

 

 

 

Файл сохраняется на сер-

 

 

 

вере под именем, состоя-

 

 

 

щим из пяти sha1-хешей,

 

 

 

получаемых на основе

 

 

 

имени файла и случайных

 

 

 

величин.

 

 

 

f_del_link_hash хранит пять

 

 

 

sha1-хешей, получаемых

 

 

 

на основе случайных ве-

 

 

 

личин. Значение этого по-

 

 

 

ля НЕ ДОЛЖНО совпадать

 

 

 

с f_name.

 

 

 

 

 

Параметры доступа

 

Параметры доступа к фай-

 

к файлу

 

лу. Например, "публич-

 

 

 

ный", "личный", "для дру-

 

 

 

зей", "для указанного круга

 

 

 

пользователей".

 

 

 

Пользователи могут со-

 

 

 

здавать свои наборы прав

 

 

 

доступа (ar_user_created

 

 

 

== 1).

 

 

 

Изначально в таблице

 

 

 

расположено несколько

 

 

 

«предустановленных»

 

 

 

прав, например: «файл

 

 

 

виден всем», «файл виден

 

 

 

только владельцу» и т.п.

 

Возрастные огра-

 

Возрастные ограничения.

 

ничения

 

Наименование ограниче-

 

 

 

ния -- TBD, см. междуна-

 

 

 

родную практику по марки-

 

 

 

ровке фильмов, игр и т.п.

 

 

 

 

 

Стр: 83/248

 

Базы данных

 

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

Комментарии

 

Плоская структура, т.е.

 

 

 

 

нельзя комментировать

 

 

 

 

комментарии.

 

 

 

 

Оценку при комментирова-

 

 

 

 

нии можно не выставлять

 

 

 

 

(NULL).

 

 

 

 

Возможно, стоит сделать

 

 

 

 

PK тоже UNSIGNED.

 

 

 

 

 

 

 

Пользователи

 

Зарегистрированные поль-

 

 

 

 

зователи файлообменного

 

 

 

 

сервиса.

 

 

 

 

 

 

 

Роли (пользова-

 

Права ролей (правами об-

 

 

тель может нахо-

 

ладают только роли,

 

 

диться в несколь-

 

напрямую пользователям

 

 

ких ролях)

 

права давать нельзя)

 

 

 

 

 

 

 

Файлы, закачанные

 

Связь между пользовате-

 

 

или скачанные

 

лем и файлами. Здесь учи-

 

 

данным пользова-

 

тывается, закачал и/или

 

 

телем

 

скачал пользователь тот

 

 

 

 

или иной файл (и сколько

 

 

 

 

раз). В т.ч. учитывается,

 

 

 

 

сколько раз пользователь

 

 

 

 

закачивал файл с таким

 

 

 

 

именем.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Стр: 84/248

 

Базы данных

 

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

Лог

 

Хранит действия за по-

 

 

 

 

следний месяц, потом они

 

 

 

 

переносятся в архив лога.

 

 

 

 

 

 

 

Архив лога

 

Здесь PK яваляется 255-

 

 

 

 

разрядным 36-ричным

 

 

 

 

числом. При перемещении

 

 

 

 

записей из основного лога

 

 

 

 

это число должно автоин-

 

 

 

 

крементироваться. Проду-

 

 

 

 

мать механизм переноса

 

 

 

 

(возможно, стоит исполь-

 

 

 

 

зовать хранимую процеду-

 

 

 

 

ру).

 

 

 

 

В эту таблицу НЕЛЬЗЯ

 

 

 

 

писать данные «напря-

 

 

 

 

мую»!!! Можно только

 

 

 

 

перемещать из таблицы

 

 

 

 

log.

 

 

Чёрный список IP-

 

Чёрный список ip-адресов

 

 

адресов

 

(для бана зарегистриро-

 

 

 

 

ванных пользователей ис-

 

 

 

 

пользовать таблицу поль-

 

 

 

 

зователей).

 

 

 

 

 

 

 

Причины блокиро-

 

Причины бана.

 

 

вок

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Стр: 85/248

 

Базы данных

 

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

Страницы сайта

 

p_parent – рекурсивный

 

 

 

 

внешний ключ. Предусмот-

 

 

 

 

реть ограничение: p_parent

 

 

 

 

может быть NULL только у

 

 

 

 

ОДНОЙ (главной) страни-

 

 

 

 

цы.

 

 

 

 

 

 

 

Ссылки на скачи-

 

После того, как пользова-

 

 

вание файлов

 

тель закачал файл, он мо-

 

 

 

 

жет скачать его из «лично-

 

 

 

 

го кабинета» или «дать

 

 

 

 

ссылку другу». Ссылка по-

 

 

 

 

мещается в эту таблицу и

 

 

 

 

имеет «срок годности».

 

 

 

 

 

 

 

Интенсивность

 

Итенсивность скачиваний

 

 

скачиваний

 

(дополнение основного

 

 

 

 

лога: сколько раз за неко-

 

 

 

 

торое время использовали

 

 

 

 

конкретную ссылку для

 

 

 

 

скачивания).

 

 

 

 

 

 

 

Информация о ре-

 

Все поля кэшируются на

 

 

сурсе

 

основе агрегирования дан-

 

 

 

 

ных из других таблиц.

 

 

 

 

В этой таблице должна

 

 

 

 

быть ТОЛЬКО ОДНА за-

 

 

 

 

пись.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Стр: 86/248

Базы данных

 

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

Группы пользова-

 

Группы пользователей

 

телей

 

(для создания "групп дру-

 

 

 

зей", групп доступа к ка-

 

 

 

ким-то файлам и т.д.) Вла-

 

 

 

делец группы отмечается в

 

 

 

user_group_m2m_user.

 

 

 

 

 

<none>

 

Связь между файлами и

 

 

 

группами пользователей (с

 

 

 

соответствующими права-

 

 

 

ми).

 

 

 

 

 

<none>

 

Связь между пользовате-

 

 

 

лями и группами пользова-

 

 

 

телей.

 

 

 

 

 

<none>

 

Связь между ролями поль-

 

 

 

зователей и пользовате-

 

 

 

лями.

 

 

 

 

 

<none>

 

Связь между ролями поль-

 

 

 

зователей и правами ро-

 

 

 

лей пользователей.

 

 

 

 

 

Итак, схема БД получена. Её можно экспортировать в СУБД и получить реально работающую БД.

Стр: 87/248

Базы данных

БГУИР, ПОИТ

 

 

Сейчас необходимо ещё раз внимательно просмотреть всё, что у нас есть по даталогическому уровню, и добавить необходимые ограничения целостности и консистентности данных, реализуя соответствующие триггеры и хранимые подпрограммы (процедуры и функции).

Стр: 88/248

Базы данных

БГУИР, ПОИТ

 

 

Снова обратимся к таблице, в которой перечислены все таблицы БД, и отметим, где и какие императивные ограничения нужны.

Примечание: декларативными ограничениями являются ключи и связи; императивными (т.е. такими, которые «что-то делают») – триггеры и хранимые подпрограммы.

Здесь отразим только те таблицы БД, для которых необходимо добавить императивные ограничения.

 

Таблица БД

Императивные ограничения

Комментарии

 

 

 

f_name не должно совпадать с

Одна из основных,

 

 

 

f_del_link_hash

наиболее часто ис-

 

 

 

 

пользуемых таблиц.

 

 

 

 

Максимально про-

 

 

 

 

думать оптимиза-

 

 

 

 

цию производи-

 

 

 

 

тельности!

 

 

 

 

Файл сохраняется на

 

 

 

 

сервере под именем,

 

 

 

 

состоящим из пяти

 

 

 

 

sha1-хешей, получа-

 

 

 

 

емых на основе име-

 

 

 

 

ни файла и случай-

 

 

 

 

ных величин.

 

 

 

 

f_del_link_hash хра-

 

 

 

 

нит пять sha1-хешей,

 

 

 

 

получаемых на осно-

 

 

 

 

ве случайных вели-

 

 

 

 

чин. Значение этого

 

 

 

 

поля НЕ ДОЛЖНО

 

 

 

 

совпадать с f_name.

 

 

Было:

На данном этапе анализа была вы-

Параметры доступа к

 

 

 

явлена ошибка проектирования. Не-

файлу. Например,

 

 

 

удобно и нелогично использовать

"публичный", "лич-

 

 

 

ar_user_created, куда лучше – сде-

ный", "для друзей",

 

 

 

лать ссылку на пользователя, со-

"для указанного круга

 

 

 

здавшего право доступа.

пользователей".

 

 

 

И также следует предусмотреть импе-

Пользователи могут

 

 

Стало:

ративное ограничение: ar_name может

создавать свои набо-

 

 

 

совпадать для прав, созданных разны-

ры прав доступа

 

 

 

ми пользователями, но не может быть

(ar_user_created ==

 

 

 

двух одноимённых прав, созданных

1).

 

 

 

одним и тем же пользователем. Также

 

 

 

 

имя права (ar_name), созданного поль-

Изначально в табли-

 

 

 

зователем, не может совпадать с име-

це расположено не-

 

 

 

нем «предустановленного права».

сколько «предуста-

 

 

 

 

новленных» прав,

 

 

 

 

например: «файл

 

 

 

 

виден всем», «файл

 

 

 

 

виден только вла-

 

 

 

 

дельцу» и т.п.

 

 

Было:

Ещё одна ошибка проектирования:

Возрастные ограни-

 

 

 

al_min_age должен быть беззнаковым.

чения. Наименование

 

 

 

 

ограничения -- TBD,

 

 

 

И, с точки зрения здравого смысла, не

см. международную

 

 

 

имеет делать категорию с фозрастны-

практику по марки-

 

 

 

ми ограничениями до 10-ти лет (хотя,

ровке фильмов, игр и

 

 

 

 

 

 

 

 

 

Стр: 89/248

 

Базы данных

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

надо бы уточнить у юристов).

т.п.

 

 

Стало:

 

 

 

 

 

 

 

 

 

 

 

 

Дата регистрации должна быть больше

Зарегистрированные

 

 

 

даты рождения.

пользователи

 

 

 

 

файлообменного

 

 

 

Также только сейчас было обнаруже-

сервиса.

 

 

 

но, что в этой таблице не хватает

 

 

 

 

 

поля, которое бы хранило имя пользо-

 

 

 

 

 

вателя для отображения на страни-

 

 

 

 

 

цах ресурса.

 

 

 

 

 

 

 

 

 

 

Запретить прямую вставку в эту табли-

Здесь PK яваляется

 

 

 

цу. Возможно, за счёт управления пра-

255-разрядным 36-

 

 

 

вами из хранимой процедуры. Реали-

ричным числом. При

 

 

 

зовать перенос данных за последний

перемещении запи-

 

 

 

(завершившийся к данному моменту)

сей из основного лога

 

 

 

месяц из таблицы log.

это число должно

 

 

 

 

автоинкрементиро-

 

 

 

Сделать своё решение с автоинкре-

ваться. Продумать

 

 

 

ментом 255-разрядного 36-ричного

механизм переноса

 

 

 

ключа.

(возможно, стоит ис-

 

 

 

 

пользовать хранимую

 

 

 

 

процедуру).

 

 

 

 

В эту таблицу

 

 

 

 

НЕЛЬЗЯ писать

 

 

 

 

данные «напря-

 

 

 

 

мую»!!! Можно

 

 

 

 

только перемещать

 

 

 

 

из таблицы log.

 

 

 

p_parent может быть NULL только у

p_parent – рекурсив-

 

 

 

одной страницы (главной страницы

ный внешний ключ.

 

 

 

сайта).

Предусмотреть огра-

 

 

 

 

ничение: p_parent

 

 

 

 

может быть NULL

 

 

 

 

только у ОДНОЙ

 

 

 

 

(главной) страницы.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Стр: 90/248

Базы данных

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

dl_hash и dl_cookie_hash не должны

После того, как поль-

 

 

совпадать.

зователь закачал

 

 

 

файл, он может ска-

 

 

 

чать его из «личного

 

 

 

кабинета» или «дать

 

 

 

ссылку другу». Ссыл-

 

 

 

ка помещается в эту

 

 

 

таблицу и имеет

 

 

 

«срок годности».

 

 

 

 

 

 

Потребность наполнять эту тублицу

Все поля кэшируются

 

 

данными приводит к необходимости

на основе агрегиро-

 

 

написать «агрегирующие хранимые

вания данных из дру-

 

 

процедуры», которые будут вычиты-

гих таблиц.

 

 

вать данные из других таблиц и запи-

 

 

 

сывать сюда. Вешать отдельные триг-

В этой таблице

 

 

геры на другие таблицы нерациональ-

должна быть ТОЛЬ-

 

 

но – это сильно скажется на произво-

КО ОДНА запись.

 

 

дительности.

 

 

 

Также имеет смысл добавить сюда по-

 

 

 

ле с информацией о том, когда эта кэ-

 

 

 

ширующая таблица последний раз об-

 

 

 

новлялась.

 

 

Итак, на текущий момент мы в общих чертах продумали императивные ограничения. Практика показывает, что в процессе реализации приложения будут выявлены иные императивные и декларативные ограничения, которые сейчас просто неочевидны. Также более вдумчивый анализ модели БД позволил выявить в ней несколько ошибок и прийти к выводу о том, что везде, где мы не собираемся хранить отрицательный числа, а само хранимое значение может быть большим, имеет смысл использовать BIGINT UNSIGNED.

Приступим к написанию триггеров и хранимых подпрограмм.

 

Таблица БД

Императивные огра-

Код

 

 

 

ничения

 

 

 

 

f_name не должно сов-

DROP TRIGGER IF EXISTS

 

 

 

падать с f_del_link_hash

`unique_hashes_bi`;

 

 

 

 

delimiter //

 

 

 

 

CREATE TRIGGER

 

 

 

 

`unique_hashes_bi` BEFORE INSERT

 

 

 

 

ON `file`

 

 

 

 

FOR EACH ROW

 

 

 

 

BEGIN

 

 

 

 

IF NEW.`f_name` =

 

 

 

 

NEW.`f_del_link_hash` THEN

 

 

 

 

SIGNAL SQLSTATE '45000' SET

 

 

 

 

MESSAGE_TEXT = 'Hashes for file

 

 

 

 

name and deletion link can not be

 

 

 

 

equal', MYSQL_ERRNO = 1001;

 

 

 

 

END IF;

 

 

 

 

END

 

 

 

 

//

 

 

 

 

delimiter ;

 

 

 

 

DROP TRIGGER IF EXISTS

 

 

 

 

 

 

 

 

 

Стр: 91/248

 

Базы данных

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

 

 

`unique_hashes_bu`;

 

 

 

 

delimiter //

 

 

 

 

CREATE TRIGGER

 

 

 

 

`unique_hashes_bu` BEFORE UP-

 

 

 

 

DATE ON `file`

 

 

 

 

FOR EACH ROW

 

 

 

 

BEGIN

 

 

 

 

IF NEW.`f_name` =

 

 

 

 

NEW.`f_del_link_hash` THEN

 

 

 

 

SIGNAL SQLSTATE '45000' SET

 

 

 

 

MESSAGE_TEXT = 'Hashes for file

 

 

 

 

name and deletion link can not be

 

 

 

 

equal', MYSQL_ERRNO = 1001;

 

 

 

 

END IF;

 

 

 

 

END

 

 

 

 

//

 

 

 

 

delimiter ;

 

 

 

ar_name может совпа-

DROP TRIGGER IF EXISTS

 

 

 

дать для прав, создан-

`unique_access_right_bi`;

 

 

 

ных разными пользова-

 

 

 

 

телями, но не может

delimiter //

 

 

 

быть двух одноимённых

 

 

 

 

прав, созданных одним

CREATE TRIGGER

 

 

 

и тем же пользовате-

`unique_access_right_bi` BEFORE

 

 

 

лем. Также имя права

INSERT ON `access_right`

 

 

 

(ar_name), созданного

FOR EACH ROW

 

 

 

пользователем, не мо-

BEGIN

 

 

 

жет совпадать с именем

DECLARE duplicates integer;

 

 

 

«предустановленного

 

 

 

 

права».

SELECT count(*) INTO duplicates

 

 

 

 

from `access_right` where

 

 

 

 

`ar_name`=NEW.`ar_name` AND

 

 

 

 

(ISNULL(`ar_u_uid`) OR

 

 

 

 

`ar_u_uid`=NEW.`ar_u_uid`);

 

 

 

 

IF duplicates > 0 THEN

 

 

 

 

SIGNAL SQLSTATE '45000' SET

 

 

 

 

MESSAGE_TEXT = 'Access right

 

 

 

 

name must be unique for one user and

 

 

 

 

must not be similar to predefined

 

 

 

 

name', MYSQL_ERRNO = 1001;

 

 

 

 

END IF;

 

 

 

 

END

 

 

 

 

//

 

 

 

 

delimiter ;

 

 

 

 

DROP TRIGGER IF EXISTS

 

 

 

 

`unique_access_right_bu`;

 

 

 

 

delimiter //

 

 

 

 

CREATE TRIGGER

 

 

 

 

`unique_access_right_bu` BEFORE

 

 

 

 

UPDATE ON `access_right`

 

 

 

 

FOR EACH ROW

 

 

 

 

 

 

 

 

 

Стр: 92/248

 

Базы данных

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BEGIN

 

 

 

 

 

DECLARE duplicates integer;

 

 

 

 

 

SELECT count(*) INTO duplicates

 

 

 

 

 

from `access_right` where

 

 

 

 

 

`ar_name`=NEW.`ar_name` AND

 

 

 

 

 

(ISNULL(`ar_u_uid`) OR

 

 

 

 

 

`ar_u_uid`=NEW.`ar_u_uid`);

 

 

 

 

 

IF duplicates > 0 THEN

 

 

 

 

 

SIGNAL SQLSTATE '45000' SET

 

 

 

 

 

MESSAGE_TEXT = 'Access right

 

 

 

 

 

name must be unique for one user and

 

 

 

 

 

must not be similar to predefined

 

 

 

 

 

name', MYSQL_ERRNO = 1001;

 

 

 

 

 

END IF;

 

 

 

 

 

END

 

 

 

 

 

//

 

 

 

 

 

 

 

 

delimiter ;

 

 

 

Не имеет смысла де-

 

Задание для самоподготовки: со-

 

 

 

 

 

лать категорию с воз-

 

здать соответствующие ограничения

 

 

 

 

 

растными ограничения-

 

самостоятельно.

 

 

 

 

 

ми до 10-ти лет.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Дата регистрации долж-

 

DROP TRIGGER IF EXISTS

 

 

 

на быть больше даты

 

`reg_date_gt_birth_date_bi`;

 

 

 

рождения.

 

 

 

 

 

 

 

 

 

 

delimiter //

 

 

 

 

 

CREATE TRIGGER

 

 

 

 

 

`reg_date_gt_birth_date_bi` BEFORE

 

 

 

 

 

INSERT ON `user`

 

 

 

 

 

FOR EACH ROW

 

 

 

 

 

BEGIN

 

 

 

 

 

IF NEW.`u_reg_date` <=

 

 

 

 

 

NEW.`u_birth_date` THEN

 

 

 

 

 

SIGNAL SQLSTATE '45000' SET

 

 

 

 

 

MESSAGE_TEXT = 'Registration date

 

 

 

 

 

can not be less or equal to birth date',

 

 

 

 

 

MYSQL_ERRNO = 1001;

 

 

 

 

 

END IF;

 

 

 

 

 

END

 

 

 

 

 

//

 

 

 

 

 

 

 

 

delimiter ;

 

 

 

 

 

DROP TRIGGER IF EXISTS

 

 

 

 

 

`reg_date_gt_birth_date_bu`;

 

 

 

 

 

delimiter //

 

 

 

 

 

CREATE TRIGGER

 

 

 

 

 

`reg_date_gt_birth_date_bu` BEFORE

 

 

 

 

 

UPDATE ON `user`

 

 

 

 

 

FOR EACH ROW

 

 

 

 

 

BEGIN

 

 

 

 

 

IF NEW.`u_reg_date` <=

 

 

 

 

 

NEW.`u_birth_date` THEN

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Стр: 93/248

Базы данных

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

 

 

SIGNAL SQLSTATE '45000' SET

 

 

MESSAGE_TEXT = 'Registration date

 

 

can not be less or equal to birth date',

 

 

MYSQL_ERRNO = 1001;

 

 

END IF;

 

 

END

 

 

//

 

 

 

 

 

delimiter ;

 

Запретить прямую

Задание для самоподготовки: ре-

 

 

 

вставку в эту таблицу.

ализовать решение самостоятельно.

 

 

 

Возможно, за счёт

 

 

 

 

 

управления правами из

 

 

 

 

 

хранимой процедуры.

 

 

 

 

 

Реализовать перенос

 

 

 

 

 

данных за последний

 

 

 

 

 

(завершившийся к дан-

 

 

 

 

 

ному моменту) месяц из

 

 

 

 

 

таблицы log.

 

 

 

 

 

Сделать своё решение с автоинкрементом 255разрядного 36-ричного ключа.

Анализ показал, что эффективнее использовать шесть sha1 хэшей: от исходного PK, времени и 4-х случайных чисел. В схему внесены изменения – поле la_uid изменено на char(240)

p_parent может быть Задание для самоподготовки: со-

NULL только у одной здать соответствующие ограничения страницы (главной самостоятельно.

страницы сайта).

dl_hash и dl_cookie_hash Задание для самоподготовки: со-

не должны совпадать. здать соответствующие ограничения самостоятельно.

Стр: 94/248

Базы данных

БГУИР, ПОИТ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Потребность наполнять

 

Задание для самоподготовки: со-

 

 

 

эту таблицу данными

 

здать соответствующие ограничения

 

 

 

приводит к необходимо-

 

самостоятельно.

 

 

 

сти написать «агрегиру-

 

 

 

 

 

 

ющие хранимые проце-

 

 

 

 

 

 

дуры», которые будут

 

 

 

 

 

 

вычитывать данные из

 

 

 

 

 

 

других таблиц и записы-

 

 

 

 

 

 

вать сюда. Вешать от-

 

 

 

 

 

 

дельные триггеры на

 

 

 

 

 

 

другие таблицы нераци-

 

 

 

 

 

 

онально – это сильно

 

 

 

 

 

 

скажется на производи-

 

 

 

 

 

 

тельности.

 

 

 

 

 

Итак, после реализации императивных ограничений и исправления всех обнаруженных недоработок схема БД приняла следующий вид:

На данном этапе только лишь графического представления уже недостаточно – нужно иметь возможность просматривать свойства тех или иных объектов, таким образом с «распечаткой» работать будет очень тяжело – нужно полностью переключаться на работу со средством автоматизированного проектирования.

Стр: 95/248

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]