Я работаю с Python Django Framework и пытаюсь создать сайт.Я хочу добиться хорошей производительности в случае, описанном ниже, и искать хороший дизайн базы данных / модели.Поскольку в моих глазах это вопрос, связанный с базой данных, я писал о столбцах и таблицах.В Django я бы заменил их соответствующими моделями и полями.
У меня есть модель с таблицей user
и profile
.user
содержит основные данные пользователя, такие как имя пользователя и адрес электронной почты.profile
содержит все другие данные профиля, такие как имя, дата рождения, любимый цвет и так далее.profile
также имеет несколько зависимых таблиц, например, custom_fields
, где пользователи могут добавлять настраиваемые поля в свой профиль.
У одного пользователя есть только один принадлежащий ему профиль.Каждый контакт может видеть профиль пользователя.Мне нужно сохранить владельца профиля вместе с профилем.
Если пользователь (A) просматривает профиль другого пользователя (B) и пропускает некоторую информацию, A может добавить эту информацию в профиль B. Эти измененияне видны никому, кроме создателя А. Это означает, что мне нужно хранить редактор (A) и цель (B) вместе с профилем.
Я подумал о том, как спроектировать это, и нашел три подхода:
- Скопируйте таблицу
profile
(содержащую только собственный профиль пользователя) в edited_profile
(содержащую все изменения), добавьте столбец editor
для пользователя, который выполняет редактирование и управляет обеими таблицами.,Это означает, что мне также нужно скопировать все таблицы, которые зависят от profile
или нуждаются в слое таблиц соединений между profile
и зависимыми таблицами.Кроме того, если я когда-нибудь захочу улучшить или расширить модель, мне всегда придется следить за тем, чтобы обе таблицы были согласованными.Это, кажется, не лучшее решение в моих глазах. - Добавить столбцы
user
и editor
в profile
.Собственный профиль пользователя обозначен editor is NULL
.Если мне нужен профиль для чего-то другого (например, для группы), мне нужно добавить соответствующие столбцы в таблицу profile
, чтобы ссылаться на нее.Это может включать в себя множество изменений в запросах SQL, потому что мне, возможно, придется фильтровать и новые столбцы. Добавьте столбец profile_id
в profile
и создайте несколько таблиц соединений:
user_profile (fk_user_id -> user_id, fk_profile_id -> profile_id)
и edited_profile (fk_user_id -> user_id, fk_editor_id -> user_id, fk_profile_id -> profile_id)
.
Если мне нужен профиль для чего-то другого (например, группы), мне нужно добавить соответствующиеСоединительные таблицы.
Я хочу иметь хороший дизайн базы данных с производительными поисками.Обычно мне нужен собственный профиль пользователя отдельно или вместе с изменениями, внесенными другим пользователем.Какой из подходов является лучшим в отношении производительности поиска и обновления и обслуживания?Есть ли другой лучший дизайн, который я пропустил?
Спасибо за помощь!