Вы сказали:
- пользователи имеют один отдел
- пользователей имеют один отдел
- пользователей имеют много сообщений
- пользователи имеют одну фотографию
- пользователи имеют один профиль
Забавная терминология ... пользователи работают в одном отделе и, фактически, работают в одном подразделении. Поскольку, по-видимому, подразделение является частью только одного отдела, вам не нужно регистрировать как отдел, так и подразделение в таблице профиля. На самом деле, если вы делаете запись обоих, у вас есть сложное ограничение для применения. Так что, если вы что-то не сказали нам, отдел не нужен в профиле. Тем не менее, я отмечаю, что фактически нет перекрестных ссылок между департаментами и департаментами, поэтому один департамент, очевидно, может быть связан с несколькими департаментами - ничто не мешает подразделению № 1 быть связанным с одним человеком, который работает в отделе 1 и другой человек, который работает в отделе 2. Это необычно - не обязательно неправильно, но не так, как работает большинство организаций.
Существует соблазн спросить: «Если у пользователей есть только одна фотография за раз и только один профиль, зачем отделять их от пользовательской таблицы?», Но есть некоторые причины, по которым они должны быть отдельными.
Одним из ключевых моментов в таблицах моделирования является определение естественных первичных ключей. Столбцы идентификаторов не учитываются - или их можно подсчитать, но вам необходимо выяснить, какие другие комбинации столбцов должны быть уникальными. Например, в таблице «Профиль», хотя есть идентификатор профиля, идентификатор пользователя должен быть уникальным в соответствии с указанными вами правилами, поэтому фактически идентификатор профиля является излишним - фактически пустая трата (дважды; один раз для столбец данных и один раз для индекса, который будет на нем создан). Теперь, если вы решили, что у пользователя может быть несколько профилей с течением времени, а профили имеют допустимый период или что-то подобное, то в столбце «Идентификатор профиля» имеет смысл, но последний пункт маркера больше не действителен.
Почему в таблице сообщений вы записываете и идентификатор пользователя, и идентификатор профиля? Опять же, это дает вам сложное ограничение, которое не приводит к очевидным преимуществам. Идентификатор профиля достаточно; из этого вы можете найти пользователя.
Вы говорите, что у пользователя есть одна фотография, но это не то, что вы смоделировали. Вы смоделировали «у каждого профиля есть фотография, и фотография используется только одним профилем». Кроме того, на самом деле вы не смоделировали «пользователи имеют один подраздел»; Вы смоделировали «профили имеют один подотдел». Скорее всего, это проблема с неаккуратными определениями, но вы должны быть осторожны, потому что неаккуратные определения приводят к неаккуратным базам данных, а неаккуратные базы данных приводят к неправильным ответам и плохой производительности.
Исправьте эти проблемы, и у вас будет долгий путь к созданию более работоспособного дизайна. Однако я не уверен, что обнаружил все аномалии, которые существуют в этой схематической схеме.