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

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

Что должна уметь база данных телефонного справочника

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

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

  • 📇 Хранение контактов с неограниченным числом телефонов на абонента
  • 🔍 Поиск по фамилии, имени, номеру или его фрагменту
  • 🏷️ Категории и группы для фильтрации записей
  • ✏️ Редактирование и удаление записей без потери связанных данных
  • 📤 Экспорт в CSV или другой обменный формат

Проектирование структуры таблиц

Классическая схема справочника включает минимум две таблицы: contacts (абоненты) и phones (номера). Связь между ними — один ко многим: один контакт — много телефонов. В таблице номеров добавляется внешний ключ contact_id, ссылающийся на первичный ключ абонента.

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

ТаблицаНазначениеКлючевые поля
contactsДанные абонентаid, last_name, first_name, email, notes
phonesНомера телефоновid, contact_id, phone_number, phone_type
categoriesСправочник группid, category_name
contact_categoriesСвязь контактов и группcontact_id, category_id

Обратите внимание на таблицу contact_categories: она реализует связь многие ко многим, ведь один контакт может входить в несколько групп, а одна группа содержит множество контактов. Если категория у контакта строго одна, промежуточная таблица не нужна — достаточно поля category_id в contacts.

💡

Номера телефонов всегда храните в отдельной таблице с внешним ключом — это главное правило нормализации телефонного справочника.