#mysql #database #database-design
#mysql #База данных #база данных-дизайн
Вопрос:
Я занимаюсь проектированием базы данных, у которой в конечном итоге будут тысячи пользователей. У каждого пользователя есть свой профиль и связанные с ним конкретные данные.
По вашему мнению, лучше всего использовать таблицу для идентификатора, имени пользователя, ссылки активации и хэша, а другую — для адреса, возраста, фотографии, работы, или лучше всего использовать уникальную таблицу для всего?
спасибо за ваше время
Ответ №1:
Если:
- У всех (или почти всех) пользователей все данные заполнены
- Большую часть времени вы запрашиваете все поля
тогда храните их в одной таблице, иначе они разделятся.
В вашей модели, activationLink
кажется, запрашивается только один раз за активацию, поэтому я бы переместил его в отдельную таблицу (что позволило бы удалить его после активации учетной записи).
Адрес, возраст, фотография и должность обычно отображаются вместе с именем пользователя, поэтому было бы лучше объединить их в одну таблицу.
Комментарии:
1. в моей модели я всегда проверяю при входе в систему, активирована учетная запись или нет.
2. @Wire: конечно, но вам действительно нужно хранить ссылку активации вечно после того, как она была использована? Я бы создал 1 байт
isActive BOOL
и отбросил ссылку после того, как была выполнена активация.3. у меня есть логическое значение для активированного или неактивированного. ссылка через день или два может быть удалена, да 🙂
Ответ №2:
Не позволяйте вашему первоначальному дизайну ограничивать возможности (или просто затруднять) расширения ваших требований в будущем.
- На данный момент у пользователя может быть один,
address
поэтому вы могли бы поместить его вusers
таблицу — что, если вы хотите, чтобы они могли хранить «рабочие» и «домашние» адреса в будущем или историю прошлых адресов? - Пользователю может быть разрешено иметь только одну фотографию, но если вы поместите ее (или URL для нее) в
users.photo
, вам придется изменить структуру данных, чтобы разрешить пользователю иметь историю фотографий профиля
Как упоминает Квассной, каждое из этих решений влияет на производительность — большее количество таблиц означает большую сложность и больший потенциал для медленных запросов. Не создавайте новые таблицы ради этого, но внимательно рассмотрите свою модель данных, поскольку ее быстро становится очень сложно изменить.
Любые значения, которые строго соотносятся с user
сущностью «1 к 1» и вряд ли когда-либо изменятся и для которых требуется история (хорошим примером является дата рождения), должны указываться в таблице с основным определением. Любые потенциальные отношения «1 ко многим» (даже если они не существуют прямо сейчас) являются хорошими кандидатами для их собственных таблиц.