Как составить структуру базы данных

Руководство по разработке структуры и проектированию базы данных

Следуя принципам, описанным в этой статье, можно создать базу данных, которая работает надлежащим образом и в будущем может быть адаптирована под новые требования. Мы рассмотрим основные принципы проектирования базы данных, а также способы ее оптимизации.

  • Этапы создания базы данных
  • Анализ требований: определение цели базы данных
  • Структура базы данных: построение блоков
  • Создание связей между сущностями
    • Связь «один-к одному»
    • Связь «один-ко-многим»
    • Связь «многие-ко-многим»
    • Обязательно или нет?
    • Рекурсивные связи
    • Лишние связи
  • Нормализация базы данных
    • Первая форма нормализации
    • Вторая форма нормализации
    • Третья форма нормализации
    • Многомерные данные
  • Правила целостности данных
  • Добавление индексов и представлений
  • Расширенные свойства
  • SQL и UML
  • Системы управления базами данных

Надлежащим образом структурированная база данных:

  • Помогает сэкономить дисковое пространство за счет исключения лишних данных;
  • Поддерживает точность и целостность данных;
  • Обеспечивает удобный доступ к данным.

Основные этапы разработки базы данных:

  1. Анализ требований или определение цели базы данных;
  2. Организация данных в таблицах;
  3. Указание первичных ключей и анализ связей;
  4. Нормализация таблиц.

Рассмотрим каждый этап проектирования баз данных подробнее. Обратите внимание, что в этом руководстве рассматривается реляционная модель базы данных Эдгара Кодда, написанная на языке SQL (а не иерархическая, сетевая или объектная модели).

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

Вот несколько способов сбора информации перед созданием базы данных:

  • Опрос людей, которые будут ее использовать;
  • Анализ бизнес-форм, таких как счета-фактуры, расписания, опросы;
  • Рассмотрение всех существующих систем данных (включая физические и цифровые файлы).

Начните со сбора существующих данных, которые будут включены в базу. Затем определите типы данных, которые нужно сохранить. А также объекты, которые описывают эти данные. Например:

Клиенты

  • Имя;
  • Адрес;
  • Город, штат, почтовый индекс;
  • Адрес электронной почты.

Товары

  • Название;
  • Цена;
  • Количество в наличии;
  • Количество под заказ.

Заказы

  • Номер заказа;
  • Торговый представитель;
  • Дата;
  • Товар;
  • Количество;
  • Цена;
  • Стоимость.

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

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

Следующим шагом будет визуальное представление базы данных. Для этого нужно точно знать, как структурируются реляционные БД. Внутри базы связанные данные группируются в таблицы, каждая из которых состоит из строк и столбцов.

Чтобы преобразовать списки данных в таблицы, начните с создания таблицы для каждого типа объектов, таких как товары, продажи, клиенты и заказы. Вот пример:

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

Структура базы данных: построение блоков

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

  • CHAR — конкретная длина текста;
  • VARCHAR — текст различной длины;
  • TEXT — большой объем текста;
  • INT — положительное или отрицательное целое число;
  • FLOAT, DOUBLE — числа с плавающей запятой;
  • BLOB — двоичные данные.

Некоторые СУБД также предлагают тип данных Autonumber, который автоматически генерирует уникальный номер в каждой строке.

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

Структура базы данных: построение блоков - 2

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

Атрибуты, выбранные в качестве первичных ключей, должны быть уникальными, неизменяемыми и для них не может быть задано значение NULL (они не могут быть пустыми). По этой причине номера заказов и имена пользователей являются подходящими первичными ключами, а номера телефонов или адреса — нет. Также можно использовать в качестве первичного ключа несколько полей одновременно (это называется составным ключом).

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

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

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

Каждый объект может быть взаимосвязан с другим с помощью одного из трех типов связи:

Когда существует только один экземпляр объекта A для каждого экземпляра объекта B, говорят, что между ними существует связь «один-к одному» (часто обозначается 1:1). Можно указать этот тип связи в ER-диаграмме линией с тире на каждом конце:

Связь

Если при проектировании и разработке баз данных у вас нет оснований разделять эти данные, связь 1:1 обычно указывает на то, что в лучше объединить эти таблицы в одну.

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

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

Эта связи возникают, когда запись в одной таблице связана с несколькими записями в другой. Например, один клиент мог разместить много заказов, или у читателя может быть сразу несколько книг, взятых в библиотеке. Связи «один- ко-многим» (1:M) обозначаются так называемой «меткой ноги вороны», как в этом примере:

Связь «один-ко-многим»

Чтобы реализовать связь 1:M, добавьте первичный ключ из «одной» таблицы в качестве атрибута в другую таблицу. Если первичный ключ таким образом указан в другой таблице, он называется внешним ключом. Таблица со стороны связи «1» представляет собой родительскую таблицу для дочерней таблицы на другой стороне.

Когда несколько объектов таблицы могут быть связаны с несколькими объектами другой. Говорят, что они имеют связь «многие-ко-многим» (M:N). Например, в случае студентов и курсов, поскольку студент может посещать много курсов, и каждый курс могут посещать много студентов.

На ER-диаграмме эти связи отображаются с помощью следующих строк:

Связь «многие-ко-многим»

При проектировании структуры базы данных реализовать такого рода связи невозможно. Вместо этого нужно разбить их на две связи «один-ко-многим».

Для этого нужно создать между этими двумя таблицами новую сущность. Если между продажами и продуктами существует связь M:N, можно назвать этот новый объект «sold_products», так как он будет содержать данные для каждой продажи. И таблица продаж, и таблица товаров будут иметь связь 1:M с sold_products. Этот вид промежуточного объекта в различных моделях называется таблицей ссылок, ассоциативным объектом или таблицей связей.

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

Связь «многие-ко-многим» - 2

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

Обязательно или нет?

Два объекта могут быть взаимозависимыми (один не может существовать без другого).

Иногда при проектировании базы данных таблица указывает на себя саму. Например, таблица сотрудников может иметь атрибут «руководитель», который ссылается на другое лицо в этой же таблице. Это называется рекурсивными связями.

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

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

В то же время не все базы данных необходимо нормализовать. В целом, базы с обработкой транзакций в реальном времени (OLTP), должны быть нормализованы.

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

Первая форма нормализации (сокращенно 1NF) гласит, что во время логического проектирования базы данных каждая ячейка в таблице может иметь только одно значение, а не список значений. Поэтому таблица, подобная той, которая приведена ниже, не соответствует 1NF:

Первая форма нормализации

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

Первая форма нормализации - 2

Вместо этого во время физического проектирования базы данных разделите данные на несколько таблиц или записей, пока каждая ячейка не будет содержать только одно значение, и дополнительных столбцов не будет. Такие данные считаются разбитыми до наименьшего полезного размера. В приведенной выше таблице можно создать дополнительную таблицу «Реквизиты продаж», которая будет соответствовать конкретным продуктам с продажами. «Продажи» будут иметь связь 1:M с «Реквизитами продаж».

Вторая форма нормализации (2NF) предусматривает, что каждый из атрибутов должен полностью зависеть от первичного ключа. Каждый атрибут должен напрямую зависеть от всего первичного ключа, а не косвенно через другой атрибут.

Например, атрибут «возраст» зависит от «дня рождения», который, в свою очередь, зависит от «ID студента», имеет частичную функциональную зависимость. Таблица, содержащая эти атрибуты, не будет соответствовать второй форме нормализации.

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

Таким образом, таблица с этими полями не будет соответствовать второй форме нормализации, поскольку атрибут «название товара» зависит от идентификатора продукта, но не от номера заказа:

  • Номер заказа (первичный ключ);
  • ID товара (первичный ключ);
  • Название товара.

Третья форма нормализации (3NF): каждый не ключевой столбец должен быть независим от любого другого столбца. Если при проектировании реляционной базы данных изменение значения в одном не ключевом столбце вызывает изменение другого значения, эта таблица не соответствует третьей форме нормализации.

В соответствии с 3NF, нельзя хранить в таблице любые производные данные, такие как столбец «Налог», который в приведенном ниже примере, напрямую зависит от общей стоимости заказа:

Третья форма нормализации

В свое время были предложены дополнительные формы нормализации. В том числе форма нормализации Бойса-Кодда, четвертая-шестая формы и нормализации доменного ключа, но первые три являются наиболее распространенными.

Некоторым пользователям может потребоваться доступ к нескольким разрезам одного типа данных, особенно в базах данных OLAP. Например, им может потребоваться узнать продажи по клиенту, стране и месяцу. В этой ситуации лучше создать центральную таблицу, на которую могут ссылаться таблицы клиентов, стран и месяцев. Например:

Многомерные данные

Также с помощью средств проектирования баз данных необходимо настроить БД с учетом возможности проверки данных на соответствие определенным правилам. Многие СУБД, такие как Microsoft Access, автоматически применяют некоторые из этих правил.

Правило целостности гласит, что первичный ключ никогда не может быть равен NULL. Если ключ состоит из нескольких столбцов, ни один из них не может быть равен NULL. В противном случае он может неоднозначно идентифицировать запись.

Правило целостности ссылок требует, чтобы каждый внешний ключ, указанный в одной таблице, сопоставлялся с одним первичным ключом в таблице, на которую он ссылается. Если первичный ключ изменяется или удаляется, эти изменения необходимо реализовать во всех объектах, на которые ссылается этот ключ в базе данных.

Правила целостности бизнес-логики обеспечивают соответствие данных определенным логическим параметрам. Например, время встречи должно быть в пределах стандартных рабочих часов.

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

Хотя индексы ускоряют извлечение данных, они могут замедлять добавление, обновление и удаление данных, поскольку индекс нужно перестраивать всякий раз, когда изменяется запись.

Представление — это сохраненный запрос данных. Представления могут включать в себя данные из нескольких таблиц или отображать часть таблицы.

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

Унифицированный язык моделирования (UML) — это еще один визуальный способ выражения сложных систем, созданных на объектно-ориентированном языке. Некоторые из концепций, упомянутых в этом руководстве, известны в UML под разными названиями. Например, объект в UML известен, как класс.

Сейчас UML используется не так часто. В наши дни он применяется академически и в общении между разработчиками программного обеспечения и их клиентами.

Проектируемая структура базы данных зависит от того, какую СУБД вы используете. Некоторые из наиболее распространенных:

  • Oracle DB;
  • MySQL;
  • Microsoft SQL Server;
  • PostgreSQL;
  • IBM DB2.

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

База данных с правильной структурой обеспечит вам доступ к актуальным и точным сведениям. Поскольку правильная структура важна для выполнения поставленных задач при работе с базой данных, имеет смысл изучить принципы создания баз данных. Это поможет вам создать базу данных, отвечающую вашим потребностям и позволяющую быстро вносить в нее изменения.

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

Важно: 
Access возможности разработки, которые можно создавать приложения баз данных для Интернета. Многие аспекты проектирования отличаются при проектировании веб-страниц. В этой статье не обсуждается проектирование веб-баз данных. Дополнительные сведения см. в статье Создание базы данных Access для публикации в Интернете.

В этой статье

  • Некоторые термины, связанные с базами данных

  • Что такое правильная структура базы данных?

  • Процесс проектирования

  • Определение назначения базы данных

  • Поиск и упорядочение необходимых сведений

  • Распределение данных по таблицам

  • Преобразование элементов данных в столбцы

  • Задание первичных ключей

  • Создание связей между таблицами

  • Усовершенствование структуры

  • Применение правил нормализации

Некоторые термины, связанные с базами данных

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

Изображение трех таблиц в режиме таблицы

Каждую строку правильнее называть записью, а каждый столбец — полем. Запись — это эффективный и согласованный способ объединения сведений о чем-либо. Поле — это отдельный элемент сведений (элементы такого типа есть в каждой записи). Например, в таблице «Товары» каждая строка или запись может содержать сведения об одном товаре. Каждые столбец или поле содержат сведения определенного типа об этом товаре, например название или цену.

К началу страницы

Что такое правильная структура базы данных?

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

Правильная структура базы данных подразумевает:

  • распределение сведений по тематическим таблицам для уменьшения количества повторяющихся данных;

  • предоставление приложению Access данных, необходимых для объединения сведений в таблицах при необходимости;

  • обеспечение точности и целостности сведений;

  • соответствие требованиям к обработке данных и созданию отчетов.

К началу страницы

Процесс проектирования

Процесс проектирования включает следующие этапы:

  • Определение назначения базы данных    

    Помогает подготовиться к остальным этапам.

  • Поиск и упорядочение необходимых сведений     

    Соберите сведения всех типов, которые потребуется внести в базу данных, например названия товаров и номера заказов.

  • Разделение данных по таблицам    

    Разделите элементы данных по основным темам или группам, например «Товары» и «Заказы». Затем для каждой темы создается таблица.

  • Преобразование элементов данных в столбцы    

    Решите, какие сведения будут храниться в каждой таблице. Каждый элемент становится полем и отображается в виде столбца в таблице. Например, таблица «Сотрудники» может содержать такие поля, как «Фамилия» и «Дата найма».

  • Задание первичных ключей    

    Выберите первичный ключ для каждой таблицы. Первичный ключ — это столбец, однозначно определяющий каждую строку. Примеры: «Код товара» и «Код заказа».

  • Настройка связей между таблицами    

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

  • Усовершенствование структуры    

    Проверьте структуру базы данных на наличие ошибок. Создайте таблицы и добавьте несколько записей с образцами данных. Посмотрите, можно ли получить нужные результаты из таблиц. При необходимости внесите изменения в структуру.

  • Применение правил нормализации    

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

К началу страницы

Определение назначения базы данных

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

К началу страницы

Поиск и упорядочение необходимых сведений

Чтобы найти и упорядоступить необходимую информацию, начните с имеющихся сведений. Например, вы можете записать заказы на покупку в записи книги или сохранить сведения о клиентах в бумажных формах в картотеке. Соберите эти документы и соберите в списке каждый тип показанной информации (например, каждое поле, заполненное в форме). Если у вас еще нет форм, представьте, что вам нужно создать форму для записи сведений о клиенте. Какие сведения нужно поместить в форму? Какие поля заливки нужно создать? Определите и перечислить каждый из этих элементов. Предположим, что в настоящее время список клиентов находится на индексных карточках. Изучив эти карточки, вы можете показать, что каждая карточка содержит имя клиента, адрес, город, штат, почтовый индекс и номер телефона. Каждый из этих элементов представляет потенциальный столбец в таблице.

При подготовке списка не старайтесь придать ему законченный вид с первого раза. Записывайте все элементы, которые приходят в голову. Если с базой данных будет работать кто-то еще, попросите их внести свои предложения. Позднее вы сможете скорректировать список.

Теперь подумайте, какие типы отчетов или почтовых рассылок будут выполняться на основе сведений из базы данных. Например, это может быть отчет о продажах товаров по регионам или сводный отчет о складских запасах товаров. Возможно, вы также будете отправлять клиентам стандартные письма, содержащие сведения о продажах или специальных предложениях. Продумайте структуру отчета и представьте себе его внешний вид. Какие сведения нужно включить в отчет? Составьте список. То же сделайте для писем и других отчетов, которые предполагается создавать.

Сотрудник, который продумывает отчет о запасах продуктов

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

Для отправки клиентам почтовых сообщений требуется записать еще один элемент данных. Если клиент захочет получать почтовые сообщения, вам потребуется его адрес электронной почты. Следовательно, для каждого клиента нужно записать этот адрес.

Имеет смысл создать прототип каждого отчета или выходного списка и продумайте, какие элементы потребуется создать для этого отчета. Например, при проверке письма на бланке могут возникнуть некоторые моменты. Если вы хотите включить правильное приветствие, например строку «Г-н», «Г-жа» или «Ms», которая начинает приветствие, необходимо создать элемент приветствия. Кроме того, письма обычно начинаются с буквы «Уважаемый г-н Климов», а не «Уважаемый. Г-н Сильвстер Климов». Это позволяет сохранить фамилию отдельно от имени.

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

Подумайте о тех вопросах, ответы на которые вам поможет получать база данных. Например, каков объем продаж отдельного товара за последний месяц? Где находятся самые перспективные клиенты? Кто поставляет самый продаваемый товар? Список возможных вопросов поможет вам определить дополнительные элементы данных для записи.

Собрав все нужные сведения, вы можете переходить к следующему этапу.

К началу страницы

Распределение данных по таблицам

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

Написанный от руки список элементов, сгруппированных по темам

Основные группы здесь — товары, поставщики, клиенты и заказы. Поэтому имеет смысл использовать четыре таблицы: по одной для сведений о товарах, поставщиках, клиентах и заказах. Это не окончательный список, но неплохое начало. Вы можете уточнять список, пока не получите наиболее эффективную структуру.

При первом просмотре предварительной таблицы вам может показаться, что удобнее было бы поместить все сведения в одну таблицу, а не в четыре, как показано на предыдущей иллюстрации. Сейчас вы поймете, почему это плохая идея. Посмотрите на эту таблицу:

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

В этом случае каждая строка содержит сведения о товаре и его поставщике. Так как у одного поставщика может быть несколько товаров, имя и адрес поставщика должны повторяться несколько раз. Это пустая трата места на диске. Гораздо лучше записать сведения о поставщике только один раз в отдельной таблице «Поставщики» и связать ее с таблицей «Товары».

Вторая проблема с этой структурой возникает тогда, когда нужно изменить сведения о поставщике. Предположим, вам нужно изменить адрес поставщика. Но поскольку адрес указан во многих полях, можно случайно изменить его только в одном поле, забыв о других. Эту проблему можно решить, записав адрес поставщика только в одном поле.

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

Наконец, предположим, что у вас есть только один товар, поставляемый компанией Coho Winery, и вы хотите удалить этот товар, но сохранить имя и адрес поставщика. Как удалить запись о товаре, не потеряв сведений о поставщике? Это невозможно. Поскольку каждая запись содержит сведения и о товаре, и о поставщике, вы не можете удалить их по отдельности. Чтобы разделить эти сведения, необходимо сделать из одной таблицы две: одну — для сведений о товаре, другую —для сведений о поставщике. Тогда удаление записи о товаре не приведет к удалению записи о поставщике.

Выбрав тему для таблицы, проследите, чтобы столбцы в ней содержали сведения только по этой теме. Например, в таблице товаров должны храниться сведения только о товарах. Поскольку адрес поставщика относится к сведениям о поставщиках, а не о товарах, он должен храниться в таблице поставщиков.

К началу страницы

Преобразование элементов данных в столбцы

Чтобы определить столбцы таблицы, решите, какие сведения по теме таблицы вам нужно отслеживать. Например, в таблицу клиентов можно включить столбцы «Имя», «Адрес», «Город, область, почтовый индекс», «Отправка почты», «Обращение» и «Адрес электронной почты». Набор столбцов одинаков для всех записей в таблице, поэтому для каждой записи можно хранить одни и те же сведения. Например, столбец «Адрес» содержит адреса клиентов. Каждая запись содержит сведения только об одном клиенте, а поле адреса — его адрес.

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

Вам также нужно определить, какого рода данные будут храниться в базе данных: отечественные или международные. Например, если вы планируете хранить в базе данных международные адреса, лучше использовать столбец «Регион», а не «Страна», потому что в таком столбце можно указывать области внутри своей страны и регионы других стран. Точно так же в поле «Почтовый индекс» можно будет хранить почтовые индексы разных стран.

В списке ниже приведены некоторые советы по определению столбцов.

  • Не включайте вычисляемые данные    

    Не следует хранить в таблицах результаты вычислений. Лучше пусть Access выполняет вычисления всякий раз, как вы захотите увидеть результат. Предположим, что в отчете о заказанных товарах отображаются промежуточные итоги для заказанных товаров каждой категории. Но в таблице нет столбца для промежуточных итогов. Вместо этого в таблице есть столбец для заказанных товаров, в котором хранится количество единиц каждого товара. Используя эти данные, Access вычисляет промежуточные итоги каждый раз при печати отчета. Сами промежуточные итоги не требуется хранить в таблице.

  • Разбивайте информацию на минимальные логические компоненты    

    Может возникнуть желание использовать одно поле для полных имен или названий продуктов вместе с описаниями продуктов. Если в поле объединится несколько разных сведений, позднее будет сложно получить отдельные факты. Попробуйте разбить данные на логические части; Например, можно создать отдельные поля для имени и фамилии или для названия продукта, категории и описания.

Рисунок с изображением элементов данных в процессе создания базы данных

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

К началу страницы

Задание первичных ключей

Каждая таблица должна содержать столбец или набор столбцов для однозначного определения каждой строки таблицы. Часто для этого используется уникальный идентификационный номер, например код сотрудника или серийный номер. В базах данных эти сведения называются первичным ключом таблицы. Используя поля первичных ключей, Access быстро связывает данные из нескольких таблиц и сводит их для вас воедино.

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

У первичного ключа всегда должно быть значение. Если в какой-то момент столбец может содержать неназначенное или неизвестное (отсутствующее) значение, его нельзя использовать в качестве компонента первичного ключа.

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

Часто в качестве первичного ключа используется произвольное уникальное число. Например, каждому заказу можно назначить уникальный номер. Целью номера заказа является определение заказа. После того как оно будет назначено, оно никогда не изменится.

Если вы не имеете в виду столбец или набор столбцов, которые могут стать хорошим первичным ключом, рассмотрите возможность использования столбца с типом данных «Автономер». При использовании типа данных «Тип данных», Access автоматически назначает значение. Такой идентификатор не имеет смысла; Оно не содержит фактических сведений, описывающих строку, которую она представляет. Идентификаторы factless идеально подходят для использования в качестве первичного ключа, так как они не изменяются. Первичный ключ, содержащий сведения о строке (например, номер телефона или имя клиента), может измениться, так как сами фактуальные данные могут измениться.

Изображение таблицы продуктов с полем первичного ключа

1. Столбец с типом данных «Счетчик» — отличный первичный ключ. Коды товаров никогда не совпадают.

В некоторых случаях первичный ключ таблицы составляется из несколько полей. Например, в таблице «Сведения о заказах», которая содержит элементы строк заказов, первичный ключ может включать два столбца: «Код заказа» и «Код товара». Первичный ключ из нескольких столбцов называется составным.

В базе данных продаж вы можете создать столбец типа «Счетчик» для первичного ключа каждой из таблиц: «Код товара» для таблицы товаров, «Код заказа» для таблицы заказов, «Код клиента» для таблицы клиентов и «Код поставщика» для таблицы поставщиков.

Рисунок с изображением элементов данных в процессе создания базы данных

К началу страницы

Создание связей между таблицами

Теперь, когда вы распределили сведения по таблицам, вам нужен способ их осмысленного объединения. Например, показанная ниже форма содержит сведения из нескольких таблиц.

Форма "Заказы"

1. Эта форма содержит данные из таблиц клиентов,

2. сотрудников,

3. заказов,

4. товаров

5. и сведений о заказах.

Access — это система управления реляционными базами данных. В реляционной базе данных сведения распределяются по отдельным тематическим таблицам. Для последующего объединения данных используются связи между таблицами.

К началу страницы

Создание связи «один ко многим»

Рассмотрим пример таблиц «Поставщики» и «Товары» в базе данных «Заказы на товары». Поставщик может поставлять любое количество товаров. Следуют, что у любого поставщика, представленного в таблице «Поставщики», может быть много товаров, представленных в таблице «Товары». Поэтому связь между таблицами «Поставщики» и «Товары» является связью «один-к-многим».

Отношение "один-ко-многим"

Чтобы создать связь «один ко многим» в структуре базы данных, добавьте первичный ключ на стороне «один» в таблицу на стороне «многие» в виде дополнительного столбца или столбцов. Например, в данном случае вы добавляете столбец «Код поставщика» из таблицы «Поставщики» в таблицу «Товары». Затем Access сможет с помощью кода поставщика в таблице «Товары» найти поставщика для каждого товара.

Столбец «Код поставщика» в таблице «Товары» называется внешним ключом. Внешний ключ — это первичный ключ другой таблицы. Столбец «Код поставщика» в таблице «Товары» является внешним ключом, потому что он также является первичным ключом в таблице «Поставщики».

Рисунок с изображением элементов данных в процессе создания базы данных

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

К началу страницы

Создание связи «многие ко многим»

Рассмотрим связь между таблицами «Товары» и «Заказы».

Отдельный заказ может включать несколько товаров. С другой стороны, один товар может входить в несколько заказов. Таким образом, для каждой записи в таблице «Заказы» может существовать несколько записей в таблицы «Товары». Для каждой записи в таблице «Товары» может быть несколько записей в таблице «Заказы». Этот тип связи называется отношением «многие-к-многим», так как для любого товара может быть множество заказов. и для любого заказа может быть множество продуктов. Обратите внимание на то, что для обнаружения связей «многие-к-многим» между таблицами важно учитывать обе стороны связи.

Связь между темами двух таблиц (заказов и товаров) относится к типу «многие ко многим». Это проблема. Представьте, что произойдет, если для создания связи между двумя таблицами вы попытаетесь добавить поле «Код товара» в таблицу «Заказы». Чтобы заказ мог включать несколько товаров, вам потребуется несколько записей для каждого заказа в таблице «Заказы». В этом случае сведения о заказе придется повторять в каждой строке заказа, что может привести к неэффективности структуры таблицы и потере точности данных. Та же проблема возникает при создании поля «Код заказа» в таблице «Товары» — для каждого товара в таблице потребуется несколько записей. Как решить эту проблему?

Ответ на этот вопрос заключается в том, чтобы создать третью (связуемую) таблицу, которая разбивает связь «многие-к-многим» на две связи «один-к-многим». Первичные ключи двух таблиц вставляются в третью таблицу. В результате в третьей таблице записывают все экземпляры связи.

Отношение "многие-ко-многим"

Каждая запись в таблице «Сведения о заказах» представляет собой отдельный элемент строки заказа. Первичный ключ этой таблицы состоит из двух полей — внешних ключей таблиц «Заказы» и «Товары». Использовать только поле «Код заказа» в качестве первичного ключа для этой таблицы нельзя, поскольку в одном заказе может быть несколько элементов строки. Код заказа повторяется для каждого элемента строки, так что это поле не содержит уникальные значения. Использовать только поле «Код товара» также нельзя, поскольку один товар может входить в разные заказы. Но вместе эти два поля всегда обеспечивают уникальное значение для каждой записи.

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

  • Связь «один ко многим» между таблицами «Заказы» и «Сведения о заказах». В каждом заказе может быть несколько элементов строк, но каждый элемент строки связан только с одним заказом.

  • Связь «один ко многим» между таблицами «Товары» и «Сведения о заказах». Каждый товар может быть связан с несколькими элементами строк, но каждый элемент строки связан только с одним товаром.

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

После создания таблицы «Сведения о заказах» список таблиц и полей может выглядеть так:

Рисунок с изображением элементов данных в процессе создания базы данных

К началу страницы

Создание связи «один к одному»

Еще бывает связь «один к одному». Предположим, вам нужно записать дополнительные сведения о товаре, которые редко используются или применяются к небольшому количеству товаров. Поскольку эти сведения используются редко и в результате их хранения в таблице «Товары» образуются пустые поля для всех товаров, к которым они неприменимы, вам лучше поместить эти сведения в отдельную таблицу. Как и в таблице товаров, в качестве первичного ключа используется код товара. Связь между этой дополнительной таблицей и таблицей «Товары» относится к типу «один к одному». Каждой записи таблицы товаров соответствует одна запись в дополнительной таблице. При определении такой связи у обеих таблиц должно быть общее поле.

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

  • Если две таблицы объединены одной тематикой, для создания связи можно использовать один и тот же первичный ключ в обеих.

  • Если тематика и первичные ключи таблиц различаются, выберите любую из таблиц и вставьте ее первичный ключ в другую таблицу в качестве внешнего ключа.

Определяя связи между таблицами, вы обеспечиваете правильность таблиц и столбцов. При наличии связи «один к одному» или «один ко многим» в таблицах необходимы общие столбцы. При наличии связи «многие ко многим» необходима третья таблица, представляющая связь.

К началу страницы

Усовершенствование структуры

После создания необходимых таблиц, полей и связей следует создать и заполнить таблицы образцами данных и поработайте с ними: создание запросов, добавление новых записей и так далее. Это поможет выделить потенциальные проблемы. Например, может потребоваться добавить столбец, который вы забыли вставить на этапе разработки, или разделить таблицу на две таблицы, чтобы удалить дублирование.

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

При внимательном изучении первоначальной базы данных вы наверняка увидите, где ее можно улучшить. Вот некоторые моменты, которые нужно проверить:

  • Не забыли ли вы какие-то столбцы? Если да, относятся ли эти сведения к имеющимся таблицам? Если это сведения по другой теме, возможно, потребуется создать еще одну таблицу. Создайте столбец для каждого элемента данных, который нужно отслеживать. Если данные невозможно получить из других столбцов путем вычислений, скорее всего, для них нужен новый столбец.

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

  • Приходится ли вам неоднократно вводить одни и те же сведения в одной из таблиц? Если да, вам нужно разделить одну таблицу на две и установить между ними связь «один ко многим».

  • У вас есть таблицы с большим количеством полей, ограниченным количеством записей и множеством пустых полей в отдельных записях? Если да, подумайте о том, как изменить структуру таблицы, чтобы в ней было меньше полей и больше записей.

  • Каждый элемент данных разделен на минимальные полезные фрагменты? Поместите в отдельный столбец каждый элемент данных, который необходимо использовать для отчетов, сортировки, поиска или вычислений.

  • Данные в каждом столбце соответствуют теме таблицы? Если столбец содержит данные, которые не относятся к теме таблицы, их нужно поместить в другую таблицу.

  • Все связи между таблицами представлены общими полями или третьей таблицей? Для отношений «один к одному» и «один-к-многим» требуются общие столбцы. Для связей «многие-к-многим» требуется третья таблица.

Усовершенствование таблицы «Товары»

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

Предположим, что после проверки и уточнения дизайна базы данных вы решили сохранить вместе с ее именем описание категории. При добавлении поля «Описание категории» в таблицу «Товары» необходимо повторить описание каждой категории для каждого товара, попадаемного в эту категорию, — это не лучшее решение.

Лучше выделить категории в качестве отдельной темы для отслеживания в базе данных и создать для них отдельную таблицу с собственным первичным ключом. Затем первичный ключ таблицы «Категории» можно добавить в таблицу «Товары» в качестве внешнего ключа.

Связь между таблицами «Категории» и «Товары» относится к типу «один ко многим»: категория может включать несколько товаров, но при этом каждый товар может входить лишь в одну категорию.

Анализируя структуры таблиц, обращайте внимание на повторяющиеся группы. Рассмотрим таблицу со следующими столбцами:

  • Код товара

  • Название

  • Код товара1

  • Название1

  • Код товара2

  • Название2

  • Код товара3

  • Название3

Здесь каждый товар представлен повторяющейся группой столбцов, которые различаются только номерами в конце имени столбца. Если столбцы пронумерованы таким образом, вам следует пересмотреть структуру таблицы.

У такой структуры есть несколько недостатков. Во-первых, вам придется установить ограничение на количество товаров. После превышения этого ограничения вам потребуется добавить в структуру таблицы новую группу столбцов, а это задача не на пять минут.

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

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

К началу страницы

Применение правил нормализации

Теперь вы можете применить к структуре своей базы данных правила нормализации данных (иногда их называют просто правила нормализации). Эти правила позволяют проверить правильность структуры таблиц. Процесс применения этих правил к структуре базы данных называется нормализацией базы данных или просто нормализацией.

Нормализацию лучше всего выполнять после внесения в базу данных всех элементов данных и получения предварительной структуры. Цель этого процесса — убедиться в том, что элементы данных распределены по соответствующим таблицам. Правильность самих элементов данных при нормализации не проверяется.

Правила нормализации нужно применять последовательно, проверяя на каждом этапе соответствие структуры базы данных одной из так называемых «нормальных форм». Обычно применяются пять нормальных форм — с первой по пятую. В этой статье рассматриваются первые три формы, поскольку их достаточно для большинства структур баз данных.

Первая нормальная форма

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

Вторая нормальная форма

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

  • Код заказа (первичный ключ)

  • Код товара (первичный ключ)

  • Название товара

Эта структура не соответствует второй нормальной форме, поскольку название товара зависит от кода товара, но не зависит от кода заказа, то есть этот столбец зависит не от всего первичного ключа. Из этой таблицы нужно удалить столбец «Название товара». Он относится к другой таблице («Товары»).

Третья нормальная форма

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

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

  • Код товара (первичный ключ)

  • Название

  • Рекомендуемая розничная цена

  • Скидка

Предположим, что скидка зависит от рекомендуемой розничной цены. В этом случае таблица не соответствует третьей нормальной форме, поскольку столбец «Скидка», не являющийся ключевым, зависит от столбца «Рекомендуемая розничная цена», который тоже не является ключевым. Независимость столбцов друг от друга означает, что изменение любого неключевого столбца не должно влиять на другие столбцы. Если вы измените значение в поле «Рекомендуемая розничная цена», соответствующим образом изменится и значение скидки, тем самым нарушая правило. В данном случае столбец «Скидка» следует перенести в другую таблицу, в которой столбец «Рекомендуемая розничная цена» является ключевым.

К началу страницы

Прим. перев. Предполагается, что вы уже имеете начальные знания по SQL. Если вы плохо понимаете, что такое таблицы, строки, индексы, первичные ключи и ссылочная целостность, то лучше сначала изучить их, например по этим видео:

А если вы знакомы с SQL и вас не остановили предыдущие термины, на всякий случай напомним, что:

  • атомарность предполагает, что значение нельзя разделить на несколько атрибутов;
  • под кортежем понимается запись (строка) в таблице базы данных;
  • атрибут — это колонка таблицы;
  • неключевой атрибут — это атрибут, не входящий в состав никакого потенциального ключа.

***

Есть минимум два требования, которые должны быть соблюдены при проектировании структуры БД:

  1. Сохранить всю информацию после разделения её на таблицы.
  2. Минимизировать избыточность того, как эта информация хранится.

Примечание Второй пункт важен не только из-за того, что избыточность влияет на размер БД. Чаще всего при обновлении данных нужно обработать много строк. В таком случае вы рискуете просто забыть обновить некоторые из них, что приведёт к коллизиям внутри БД.

Ниже перечислены некоторые рекомендации, которые помогут добиться эффективной структуры:

  • используйте хотя бы третью нормальную форму;
  • создавайте ограничения для входных данных;
  • не храните ФИО в одном поле, также как и полный адрес;
  • установите для себя правила именования таблиц и полей.

Используйте хотя бы третью нормальную форму

Нормальные формы — это требования, которые должны соблюдаться при правильной проектировке базы данных.

Нормальных форм существует целых 6 штук, однако обычно соблюдают всего лишь 3 и для начала этого более чем достаточно.

Первая нормальная форма

Для примера будем использовать отношение сотрудники_отделы_проекты. В нём есть информация о номере сотрудника, его фамилии, номере отдела, в котором он работает, номере телефона отдела и так далее.

Это отношение, как и любое другое, автоматически находится в первой нормальной форме:

  • в отношении нет одинаковых кортежей;
  • кортежи не упорядочены;
  • атрибуты не упорядочены и различаются по наименованию;
  • все значения атрибутов атомарны.

Вторая нормальная форма

В нашем случае у таблицы выше имеется сложный (составной) ключ {Н_СОТР, Н_ПРО}. От части ключа Н_СОТР зависят неключевые атрибуты ФАМ, Н_ОТД, ТЕЛ. От части ключа Н_ПРО зависит неключевой атрибут ПРОЕКТ. А вот атрибут Н_ЗАДАН зависит от всего составного ключа, так как сотрудник может выполнять одно задание в одном проекте.

Поэтому для приведения отношения ко второй нормальной форме из отношения сотрудники_отделы_проекты нужно выделить два отношения сотрудники_отделы и проекты, а исходное отношение оставим отношением задания.

Наконец, третья нормальная форма

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

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

Отношение сотрудники_отделы не находится в третьей нормальной форме, так как имеется зависимость неключевых атрибутов, таких как зависимость номера телефона от номера отдела. Поэтому декомпозируем отношение сотрудники_отделы на два отношения — сотрудники и отделы:

Используйте проверочные ограничения

База данных — это не просто набор таблиц. В неё встроено много инструментов, которые помогут с сохранностью и качеством данных.

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

Внешние ключи регламентируют отношения между таблицами. Благодаря им сильно упрощается контроль за структурой базы, уменьшается и упрощается код приложения. Правильно настроенные внешние ключи — это гарант того, что увеличится целостность данных за счёт уменьшения избыточности. Поэтому обязательно применяйте ограничение внешнего ключа при определении связей между таблицами.

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

Стоит убедиться, что обязательность заполнения (NOT NULL) проверяется для полей, которые строго не должны оставаться пустыми.

Используйте CHECK, чтобы убедиться, что значения входят в диапазон (например чтобы цена не была отрицательной).

Не храните ФИО в одном поле, также как и полный адрес

Представим ситуацию, когда вам понадобится узнать, в каком городе продукт более популярен. В таком случае, если полный адрес хранится в виде цельной строки, сделать это будет очень тяжело, ведь вам нужно будет каким-то образом выделить из этой строки город. Учитывая все возможные форматы и варианты адресов, эта задача становится практически невыполнимой. Похожая ситуация и с ФИО. Даже если кажется, что это ни к чему, храните эти данные в разных полях, и в будущем вы поблагодарите себя.

Установите для себя правила именования таблиц и полей

Сложно работать с данными, которые выглядят как-то так: user.firstName, user.last_name, user.birthDate. Конечно, каждый программист в праве сам выбирать для себя стиль наименования, но для SQL рекомендуется выбрать наименование с подчёркиванием. Потому что не все SQL-движки одинаково работают с заглавными буквами, а помещать всё в кавычки бывает утомительно.

Ещё нужно определиться как будут называться таблицы — во множественном числе (users) или в единственном (user). Каждая базовая структура в БД обычно настроена на множественное число, поэтому и именовать таблицы стоит соответственно.

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

Всё приходит с опытом. Спроектируйте две-три схемы, и картинка сама сложится у вас в голове. Отталкивайтесь от задачи —некоторыми рекомендациями иногда можно пренебречь.

Перевод статьи «A humble guide to database schema design»

Время на прочтение
7 мин

Количество просмотров 405K

Перевод цикла из 15 статей о проектировании баз данных.
Информация предназначена для новичков.
Помогло мне. Возможно, что поможет еще кому-то восполнить пробелы.

Другие части: 4-6, 7-9, 10-13, 14-15.

Руководство по проектированию баз данных.

1. Вступление.

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

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

Структурированный язык запросов (SQL).

База данных создается для хранения в ней информации и получения этой информации при необходимости. Это значит, что мы должны иметь возможность помещать, вставлять (INSERT) информацию в базу данных и мы хотим иметь возможность делать выборку информации из базы данных (SELECT).
Язык запросов к базам данных был придуман для этих целей и был назван Структурированный язык запросов или SQL. Операции вставки данных (INSERT) и их выборки (SELECT) – части этого самого языка. Ниже приведен пример запроса на выборку данных и его результат.

SQL – большая тема для повествования и его рассмотрение выходит за рамки данного руководства. Данная статья строго сфокусирована на изложении процесса проектирования баз данных. Позднее, в отдельном руководстве, я расскажу об основах SQL.

Реляционная модель.

В этом руководстве я покажу вам как создавать реляционную модель данных. Реляционная модель – это модель, которая описывает как организовать данные в таблицах и как определить связи между этими таблицами.

Правила реляционной модели диктуют, как информация должна быть организована в таблицах и как таблицы связаны друг с другом. В конечном счете результат можно предоставить в виде диаграммы базы данных или, если точнее, диаграммы «сущность-связь», как на рисунке (Пример взят из MySQL Workbench).

Примеры.

В качестве примеров в руководстве я использовал ряд приложений.

РСУБД.

РСУБД, которую я использовал для создания таблиц примеров – MySQL. MySQL – наиболее популярная РСУБД и она бесплатна.

Утилита для администрирования БД.

После установки MySQL вы получаете только интерфейс командной строки для взаимодействия с MySQL. Лично я предпочитаю графический интерфейс для управления моими базами данных. Я часто использую SQLyog. Это бесплатная утилита с графическим интерфейсом. Изображения таблиц в данном руководстве взяты оттуда.

Визуальное моделирование.

Существует отличное бесплатное приложение MySQL Workbench. Оно позволяет спроектировать вашу базу данных графически. Изображения диаграмм в руководстве сделаны в этой программе.

Проектирование независимо от РСУБД.

Важно знать, что хотя в данном руководстве и приведены примеры для MySQL, проектирование баз данных независимо от РСУБД. Это значит, что информация применима к реляционным базам данных в общем, не только к MySQL. Вы можете применить знания из этого руководства к любым реляционным базам данных, подобным Mysql, Postgresql, Microsoft Access, Microsoft Sql or Oracle.

В следующей части я коротко расскажу об эволюции баз данных. Вы узнаете откуда взялись базы данных и реляционная модель данных.

2. История.

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

Так выглядели профессионалы в сфере информационных технологий в 70-е. (Слева внизу находится Билл Гейтс).

Текстовые файлы и сегодня все еще используются для хранения малых объемов простой информации. Comma-Separated Values (CSV) — значения, разделённые запятыми, очень популярны и широко поддерживаются сегодня различным программным обеспечением и операционными системами. Microsoft Excel – один из примеров программ, которые могут работать с CSV–файлами. Данные, сохраненные в таком файле могут быть считаны компьютерной программой.

Выше приведен пример того, как такой файл мог бы выглядеть. Программа, производящая чтение данного файла, должна быть уведомлена о том, что данные разделены запятыми. Если программа хочет выбрать и вывести категорию, в которой находится урок ‘Database Design Tutorial’, то она должна строчка за строчкой производить чтение до тех пор, пока не будут найдены слова ‘Database Design Tutorial’ и затем ей нужно будет прочитать следующее за запятой слово для того, чтобы вывести категорию Software.

Таблицы баз данных.

Чтение файла строчка за строчкой не является очень эффективным. В реляционной базе данных данные хранятся в таблицах. Таблица ниже содержит те же самые данные, что и файл. Каждая строка или “запись” содержит один урок. Каждый столбец содержит какое-то свойство урока. В данном случае это заголовок (title) и его категория (category).

Компьютерная программа могла бы осуществить поиск в столбце tutorial_id данной таблицы по специфическому идентификатору tutorial_id для того, чтобы быстро найти соответствующие ему заголовок и категорию. Это намного быстрее, чем поиск по файлу строка за строкой, подобно тому, как это делает программа в текстовом файле.

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

История реляционной модели.

Реляционная модель баз данных была изобретена в 70-х Эдгаром Коддом (Ted Codd), британским ученым. Он хотел преодолеть недостатки сетевой модели баз данных и иерархической модели. И он очень в этом преуспел. Реляционная модель баз данных сегодня всеобще принята и считается мощной моделью для эффективной организации данных.

Сегодня доступен широкий выбор систем управления базами данных: от небольших десктопных приложений до многофункциональных серверных систем с высокооптимизированными методами поиска. Вот некоторые из наиболее известных систем управления реляционными базами данных (РСУБД):

Oracle – используется преимущественно для профессиональных, больших приложений.
Microsoft SQL server – РСУБД компании Microsoft. Доступна только для операционной системы Windows.
Mysql – очень популярная РСУБД с открытым исходным кодом. Широко используется как профессионалами, так и новичками. Что еще нужно?! Она бесплатна.
IBM – имеет ряд РСУБД, наиболее известна DB2.
Microsoft Access – РСУБД, которая используется в офисе и дома. На самом деле – это больше, чем просто база данных. MS Access позволяет создавать базы данных с пользовательским интерфейсом.
В следующей части я расскажу кое-что о характеристиках реляционных баз данных.

3. Характеристики реляционных баз данных.

Реляционные базы данных разработаны для быстрого сохранения и получения больших объемов информации. Ниже приведены некоторые характеристики реляционных баз данных и реляционной модели данных.

Использование ключей.

Каждая строка данных в таблице идентифицируется уникальным “ключом”, который называется первичным ключом. Зачастую, первичный ключ это автоматически увеличиваемое (автоинкрементное) число (1,2,3,4 и т.д). Данные в различных таблицах могут быть связаны вместе при использовании ключей. Значения первичного ключа одной таблицы могут быть добавлены в строки (записи) другой таблицы, тем самым, связывая эти записи вместе.

Используя структурированный язык запросов (SQL), данные из разных таблиц, которые связаны ключом, могут быть выбраны за один раз. Для примера вы можете создать запрос, который выберет все заказы из таблицы заказов (orders), которые принадлежат пользователю с идентификатором (id) 3 (Mike) из таблицы пользователей (users). О ключах мы поговорим далее, в следующих частях.


Столбец id в данной таблице является первичным ключом. Каждая запись имеет уникальный первичный ключ, часто число. Столбец usergroup (группы пользователей) является внешним ключом. Судя по ее названию, она видимо ссылается на таблицу, которая содержит группы пользователей.

Отсутствие избыточности данных.

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

Ограничение ввода.

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


Когда вы создаете таблицу базы данных вы предоставляете тип данных для каждого столбца. К примеру, varchar – это тип данных для небольших фрагментов текста с максимальным количеством знаков, равным 255, а int – это числа.

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

Эти ограничения дают вам контроль над целостностью ваших данных и предотвращают ситуации, подобные следующим:

— ввод адреса (текста) в поле, в котором вы ожидаете увидеть число
— ввод индекса региона с длинной этого самого индекса в сотню символов
— создание пользователей с одним и тем же именем
— создание пользователей с одним и тем же адресом электронной почты
— ввод веса (числа) в поле дня рождения (дата)

Поддержание целостности данных.

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

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

Большинство РСУБД предлагают настройку прав доступа, которая позволяет назначать определенные права определенным пользователям. Некоторые действия, которые могут быть позволены или запрещены пользователю: SELECT (выборка), INSERT (вставка), DELETE (удаление), ALTER (изменение), CREATE (создание) и т.д. Это операции, которые могут быть выполнены с помощью структурированного языка запросов (SQL).

Структурированный язык запросов (SQL).

Для того, чтобы выполнять определенные операции над базой данных, такие, как сохранение данных, их выборка, изменение, используется структурированный язык запросов (SQL). SQL относительно легок для понимания и позволяет в т.ч. и уложненные выборки, например, выборка связанных данных из нескольких таблиц с помощью оператора SQL JOIN. Как и упоминалось ранее, SQL в данном руководстве обсуждаться не будет. Я сосредоточусь на проектировании баз данных.

То, как вы спроектируете базу данных будет оказывать непосредственное влияние на запросы, которые вам будет необходимо выполнить, чтобы получить данные из базы данных. Это еще одна причина, почему вам необходимо задуматься о том, какой должна быть ваша база. С хорошо спроектированной базой данных ваши запросы могут быть чище и проще.

Переносимость.

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

Как говорилось ранее, проектирование базы данных – это вопрос идентификации данных, их связи и помещение результатов решения данного вопроса на бумагу (или в компьютерную программу). Проектирование базы данных независимо от РСУБД, которую вы собираетесь использовать для ее создания.

В следующей части подробнее рассмотрим первичные ключи.

Как правильно создавать структуру базы данных

Как правильно создавать структуру базы данных

У меня уже несколько раз спрашивали, как создаётся структура базы данных. Как понять: какие таблицы нужны и какие поля в них потребуются? Я постараюсь в этой статье если и не дать точный ответ на этот вопрос, то хотя бы направить мышление в нужное русло.

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

То есть Ваша самая первая задача — это выделить объекты, которые будут использоваться на сайте.

Вторая задача — это у каждого объекта выделить свойства. Например, свойства у таблицы с сообщениями. Очевидно, что это уникальный идентификатор, заголовок сообщения, сам текст, дата добавления, информации о пользователей, который добавил это сообщение, и прочее. Вот для каждого свойства и нужно создавать отдельное поле в таблице. Ничего лишнего быть не должно, только то, что потом потребуется при выводе этой информации.

Третья задача — это убрать дублирование. Например, в той же таблице с сообщениями информация о пользователе может быть разной. Но нужно избегать, например, e-mail пользователя или его логин. Гораздо лучше будет поставить id_пользователя. А этот id связывает таблицу с сообщениями с таблицей с пользователями, где по этому id можно однозначно определить пользователя и все его данные.

Четвёртая задача — это продумать ключи и индексы. Очевидно, что id должен быть PRIMARY KEY. Но есть ещё и уникальные поля, для которых нужно поставить UNIQUE. Например, это могут быть логин пользователя и его e-mail. Также если по каким-то данным будет часто вестись выборка, то имеет смысл сделать для них индекс, тогда такая выборка будет проходить быстрее.

И, наконец, пятая задача — это создать все таблицы со всеми полями. Тут уже без комментариев.

Итак, подведу итог по тому, как правильно создавать структуру базы данных:

  1. Выделить объекты (сущности) на сайте.
  2. Продумать свойства для каждого из объектов.
  3. Минимизировать дублирование.
  4. Добавить ключи и индексы.
  5. Создать все таблицы, например, в phpMyAdmin.

Сразу скажу, что заранее Вы всё никогда не предусмотрите. Поэтому делайте ровно те таблицы и те поля, которые гарантированно Вам потребуются. А если что-то забудете, то всегда это можно будет добавить. Что касается правильности структуры, то тут та же история: делайте, как можете, а потом в процесс работы с базой данных, Вы сами обнаружите недостатки созданной структуры и сможете их исправить.

  • Создано 27.02.2013 04:52:42


  • Михаил Русаков

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Понравилась статья? Поделить с друзьями:
  • Как найти радиус восьмиугольника вписанного в окружность
  • Как найти лекарство в питере
  • Как найти размер инфляции
  • Как найти друзей в школе 14 лет
  • Почему электронные часы отстают как исправить