Типичная ошибка при создании базы данных телефонного справочника — хранение нескольких номеров одного абонента в одном текстовом поле через запятую: такой подход ломает поиск, сортировку и обновление записей уже на первой сотне контактов. Корректное решение — разнести абонентов и номера по отдельным связанным таблицам, чтобы каждый человек мог иметь сколько угодно телефонов без дублирования данных.
В этой статье разберём, как спроектировать структуру базы данных телефонного справочника, какие поля и связи понадобятся, как написать базовые 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.
💡Номера телефонов всегда храните в отдельной таблице с внешним ключом — это главное правило нормализации телефонного справочника.