#database #database-design
#База данных #база данных-дизайн
Вопрос:
У меня есть вопрос по дизайну базы данных.
В моем приложении у пользователя есть контактная информация, включающая
- номер телефона
- Адрес электронной почты
- адресная строка 1
- почтовый ящик
- Населенный пункт (город)
В настоящее время это находится в таблице «user» вместе с другой информацией, такой как имя пользователя, first name, …
Дело в том, что пользователь должен иметь информацию того же типа (телефон, электронная почта, …), но для своей компании.
Кажется излишним добавлять дополнительные поля в таблицу «пользователь». Поскольку данные похожи, я мог бы создать таблицу «ContactInfo» с полями:
- телефон
- Адрес электронной почты
- адрес
- почтовый ящик
- …
Хорошая ли это идея и как мне следует установить связь между таблицей «user» и этой таблицей «ContactInfo»?
РЕДАКТИРОВАТЬ: я забыл сказать, что контактная информация компании не является обязательной. У пользователя может вообще не быть компании.
Ответ №1:
Все, что имеет отношение 1: M между пользователями, должно быть в отдельной таблице. Если вас интересует только основная контактная информация пользователя, то вам может сойти с рук сохранение ее в таблице User.
Например: если допустимо иметь два телефонных номера (или более), то у вас будет другая таблица с внешним ключом к вашей таблице users и номером телефона, типом телефона и приоритетом заказа контактов.
Ответ №2:
Отдельные таблицы — правильный выбор.
CREATE TABLE users (
id INT UNSIGNED NOT NULL,
foo VARCHAR(50),
PRIMARY KEY (id) );
CREATE TABLE user_contact_info (
id INT UNSIGNED NOT NULL,
user_id INT UNSIGNED NOT NULL,
contact_type VARCHAR(40) NOT NULL,
phone VARCHAR(20),
email VARCHAR(200),
address VARCHAR(200),
postal_box VARCHAR(20),
PRIMARY KEY (id, user_id) );
Если ваша база данных поддерживает внешние ключи, должен быть внешний ключ от user_contact_info.user_id
до users.id
. user_contact_info.contact_type
было бы установлено значение work
или home
или любые другие категории, которые вам нужны.
Комментарии:
1. Это на самом деле то, что я хотел сделать. Кажется, это правильный выбор
2. Единственное, что с этим связано, — это дополнительная информация о работе. Интересно, что делать, когда пользователь удаляет информацию о своей компании. Тогда строка в user_contact_info была бы пустой.
3. Вы хотите сказать, что хотите отслеживать контактную информацию компании? Если это так, просто добавьте
companies
таблицу. Если у компании может быть более одного телефона, адреса и т.д., создайтеcompany_contact_info
таблицу, подобнуюuser_contact_info
приведенной выше таблице. Если вы хотите связатьuser
сcompany
, создайтеuser_company
таблицу, которая поддерживает связь «многие ко многим» (с индикатором типа связи:employee
,customer
, оба?).4. @Marc, если пользователь удаляет информацию о своей компании, удалите соответствующую строку в
user_contact_info
. Она не будет пустой, она исчезнет.5. В моем случае у пользователя может быть только одна компания. И я должен хранить только один номер, адрес электронной почты и т.д. Для каждой компании. Я просто говорил, что информация о компании не является обязательной и что пользователь может удалить информацию. Я не хочу отслеживать это, но если я просто обновлю его в базе данных, все поля будут пустыми.
Ответ №3:
У вас должна быть отдельная таблица телефонов, отдельная таблица электронной почты и отдельная таблица адресов. У людей есть более одного из всех трех.