Задать вопрос
@Uglik

Проектирование баз данных. Связи между профилями?

Здравствуйте.

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

Имеется профиль Парикмахера и Клиента. Как я понимаю создается таблица USERS где хранятся данные для авторизации (id, login, email, password, usergroup) и имеется 2 профиля, общее в них только (аватарка, и ФИО).

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

Интересует как быть с профилями? Как бы вы в данной ситуации спроектировали данную связь? Создали бы 2 таблицы профилей, одну для клиента другую для парикмахера и сохраняли бы для каждого свои данные или все совместил бы в одну?

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

Как грамотно и правильно спроектировать данную задачу и связать таблицу юзеров с профилями клиента и парикмахера или визажиста?
  • Вопрос задан
  • 744 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
VladimirAndreev
@VladimirAndreev
php web dev
разные таблицы
Ответ написан
Комментировать
petermzg
@petermzg
Самый лучший программист
А что клиент не может быть парихмахером? Поэтому отдельная таблица профилей людей обязательна. (ФИО, адреса, аватарки)
А далее таблица парикмахеров в которой ссылка на человека, а далее специфичные данные парикмахера.
Ответ написан
swanrnd
@swanrnd
Издатель HTML5 игр
Одна таблица, разница не существенна, будет парочка пустых полей и все.
Ответ написан
Комментировать
@Uglik Автор вопроса
Еще больше запутался. Так одну таблицу профилей делать или 2?

Вариант первый:
Пользователи:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Номер записи',
  `username` varchar(255) NOT NULL COMMENT 'Имя пользователя',
  `email` varchar(255) NOT NULL COMMENT 'Электропочта',
  `password` varchar(255) NOT NULL COMMENT 'Пароль',
   PRIMARY KEY (`id`)
)


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

CREATE TABLE `groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Номер записи',
  `name` varchar(255) NOT NULL COMMENT 'Имя группы пользователей',
   PRIMARY KEY (`id`)
)


Наборы групп, в которую входит каждый пользователь

CREATE TABLE `usergroups` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Номер записи',
  `user_id` int(11) NOT NULL COMMENT 'ID пользователя',
  `group_id` int(11) NOT NULL COMMENT 'ID группы пользователей',
   PRIMARY KEY (`id`)
)


И одна таблица с профилями:

CREATE TABLE `profile` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Номер записи',
  `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Номер записи',
  `avatar` varchar(255) NOT NULL COMMENT 'Аватарка',
  `firstname` varchar(255) NOT NULL COMMENT 'Имя пользователя',
  `lastname` varchar(255) NOT NULL COMMENT 'Фамилия пользователя',
  `about` text COMMENT 'О себе',
  `location_id` int(11) NOT NULL COMMENT 'Индификатор города',
  `haircut_id` int(11) NOT NULL COMMENT 'Индификатор стрижки',
  `price` decimal(10,2) NOT NULL COMMENT 'Индификатор стрижки',
  `contacts_id` int(11) NOT NULL COMMENT 'Индификатор контакта',
  `portfolio_id` int(11) NOT NULL COMMENT 'Индификатор портфолио',
  `reviews_id` int(11) NOT NULL COMMENT 'Индификатор отзыва',
   PRIMARY KEY (`id`)
)


В таком случае будет много полей пустых, но многие поля NOT NULL с индикаторами других таблиц с данными. Как в данной ситуации быть.

Вариант второй:

Тоже самое только 2 таблицы профилей:

Парикмахеры

CREATE TABLE `profile_hairdresser` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Номер записи',
  `user_id` int(11) NOT NULL COMMENT 'Номер записи',
  `avatar` varchar(255) NOT NULL COMMENT 'Аватарка',
  `firstname` varchar(255) NOT NULL COMMENT 'Имя пользователя',
  `lastname` varchar(255) NOT NULL COMMENT 'Фамилия пользователя',
  `about` text COMMENT 'О себе',
  `location_id` int(11) NOT NULL COMMENT 'Индификатор города',
  `haircut_id` int(11) NOT NULL COMMENT 'Индификатор стрижки',
  `price` decimal(10,2) NOT NULL COMMENT 'Индификатор стрижки',
  `contacts_id` int(11) NOT NULL COMMENT 'Индификатор контакта',
  `portfolio_id` int(11) NOT NULL COMMENT 'Индификатор портфолио',
  `reviews_id` int(11) NOT NULL COMMENT 'Индификатор отзыва',
   PRIMARY KEY (`id`)
)


Клиенты

CREATE TABLE `profile_client` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Номер записи',
  `user_id` int(11) NOT NULL COMMENT 'Номер записи',
  `avatar` varchar(255) NOT NULL COMMENT 'Аватарка',
  `firstname` varchar(255) NOT NULL COMMENT 'Имя пользователя',
  `lastname` varchar(255) NOT NULL COMMENT 'Фамилия пользователя',
   PRIMARY KEY (`id`)
)


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

Промежуточная таблица получаеться типа:

CREATE TABLE `profile_client_hairdresser` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'Номер записи',
  `user_id` int(11) NOT NULL COMMENT 'ID пользователя',
  `profile_id` int(11) NOT NULL COMMENT 'ID профиля пользователей',
   PRIMARY KEY (`id`)
)


НО профиля у нас 2!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы