Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
Приложение к видео
Русский язык и проектирование реляционных баз данных
В видеоуроке я рассуждал о том, что за словами русского языка может прятаться много смыслов. И чтобы корректно проектировать базы данных, нужно уметь находить то, что прячется за русскими словами или словами любого другого естественного языка.
Пример 1.
Мы пытаемся рассмотреть систему классов в школе. Возможно речь идёт о том, что такую базу данным потом придётся встраивать в большую БД, например для информационной системы "Классный журнал" или что-то подобное.
Вот что мы понимаем по слово 'класс'. Это не название класса, типа 1а, 3б, 7д. Это коллектив, который в какой-то момент образовался. Может быть это произошло, когда 1 сентября в школу пришли первоклассники, а может класс образовался уже потом: какой-то класс был разделён или же класс перешёл из другой школы. Вот это ключевая мысль. Класс это коллектив, который образовался и живёт какое-то время, проходя определённые этапы. В идеале 11 лет, ну или меньше. Когда класс закончил своё существование, вся его история должна остаться.
Также можно говорить об ученике. Он может "передвигаться" между классами: приходит в класс, уходить из класса, переходить из одного класса в другой.
На рисунке 1 представлена схема данных "классы-ученики". Самое главное здесь то, что мы отделили название класса от коллектива класса. Таким образом у нас сохраняется вся история класса. Статус показывает, что с классом произошло. Если класс по каким-то причинам расформирован, то вот его новое (последнее) состояние (запись в таблице Стал) уже не связано с какой-либо записью таблицы Название. Кстати, столбец Статус в общем-то и не обязателен. Просто в таблицу название можно включить дополнительные значения. Но это уже, я бы сказал, детали, которые сути не меняют. Атрибут Год таблицы Классы важная характеристика. Это год, когда класс был образован.
Также столбец Статус (таблица Учится) говорит нам о том, что произошло с учеником. Вполне возможно, что для данного ученика запись будет только одна. И все его изменения будут связаны с тем, что класс просто будет менять названия.
Пример 2.
Следующий наш пример это русское слово 'Книга'. Многозначное слово, я бы сказал. Рисунок 2 как раз это иллюстрирует. Теоретически можно было бы создать 4 сущности (таблицы), у каждой свой набор атрибутов и связей. Например, Рукопись связана с авторами, а Издание с номером ISBN.
Но я что-то поленился это делать, а спроектировал не совсем правильную, но рабочую базу данных, представленную на рисунке 3.
Тем самым я забежал несколько вперёд и по-сути рассмотрел вопрос об оптимизации баз данных. Это когда корректную базу данных преобразуют для того, чтобы было удобно с ней работать или чтобы запросы к ней работали быстро.
Да, в таблице Книги мы хитро спрятали несколько сущностей, но сокрытие это связано не со столбцами таблицы, а связанными с ней другими таблицами. Например таблицу Написали можно интерпретировать как рукопись. А таблица ISBN-Год совмещает в себе то, что выходит из издательства и из типографии (можно добавить тираж). И всё же в одной из следующих статей я помещу правильную базу данных. Уж очень важный это вопрос.
Пример 3.
Ну а теперь, рассмотрим вопрос что есть и врач и пациент и почему и у того и другого есть фамилия (ФИО), см. Рисунок 4. Но прежде отметим значимость таблицы Приём. Эта таблица реализует связь между доктором и пациентом. Именно тогда и происходит всё самое главное: постановка диагноза, направление на исследование, выписка рецептов и т.д.
Обычно база данных на рисунке 4 не вызывает особых сомнений. Но вот когда неожиданно возникает задача выяснить, кто из докторов был пациентом поликлиники, тогда обычно задумываются. Обычное предложение от студентов: так проверить по ФИО и всё. Можно, только вот это будет не точно, получим, так сказать "подозрительных" докторов. Решение связано с тем, что база данных на рисунке 4 упускает одну важную вещь. ФИО не является атрибутом врача или пациента. Это нас опять великий и могучий русский язык запутал, а точнее не желание глубже вникнуть в суть вещей. ФИО характеризует любого человека, это свойство человека, а врачи и доктора, конечно же люди (про ИИ забыл, свят, свят, свят...).
Вот, что у нас получилось в конечном итоге (см. Рисунок 5). Таблицу Человек (сущность) обычно называют суперклассом. Вот теперь ФИО у человека, а у таблиц Врач и Пациент идентификаторы человека. Совпадение идентификаторов даёт однозначный ответ на вопрос: кто из врачей был пациентом поликлиники.
Ну, пока всё!
Пишите свои предложения и замечания и занимайтесь программированием, а также проектированием баз данных, хотя бы для поддержания уровня интеллекта.