Подходы для модели базы данных с несколькими переходами - PullRequest
1 голос
/ 23 сентября 2019

Я работаю с Python Django Framework и пытаюсь создать сайт.Я хочу добиться хорошей производительности в случае, описанном ниже, и искать хороший дизайн базы данных / модели.Поскольку в моих глазах это вопрос, связанный с базой данных, я писал о столбцах и таблицах.В Django я бы заменил их соответствующими моделями и полями.

У меня есть модель с таблицей user и profile.user содержит основные данные пользователя, такие как имя пользователя и адрес электронной почты.profile содержит все другие данные профиля, такие как имя, дата рождения, любимый цвет и так далее.profile также имеет несколько зависимых таблиц, например, custom_fields, где пользователи могут добавлять настраиваемые поля в свой профиль.

У одного пользователя есть только один принадлежащий ему профиль.Каждый контакт может видеть профиль пользователя.Мне нужно сохранить владельца профиля вместе с профилем.

Если пользователь (A) просматривает профиль другого пользователя (B) и пропускает некоторую информацию, A может добавить эту информацию в профиль B. Эти измененияне видны никому, кроме создателя А. Это означает, что мне нужно хранить редактор (A) и цель (B) вместе с профилем.

Я подумал о том, как спроектировать это, и нашел три подхода:

  1. Скопируйте таблицу profile (содержащую только собственный профиль пользователя) в edited_profile (содержащую все изменения), добавьте столбец editor для пользователя, который выполняет редактирование и управляет обеими таблицами.,Это означает, что мне также нужно скопировать все таблицы, которые зависят от profile или нуждаются в слое таблиц соединений между profile и зависимыми таблицами.Кроме того, если я когда-нибудь захочу улучшить или расширить модель, мне всегда придется следить за тем, чтобы обе таблицы были согласованными.Это, кажется, не лучшее решение в моих глазах.
  2. Добавить столбцы user и editor в profile.Собственный профиль пользователя обозначен editor is NULL.Если мне нужен профиль для чего-то другого (например, для группы), мне нужно добавить соответствующие столбцы в таблицу profile, чтобы ссылаться на нее.Это может включать в себя множество изменений в запросах SQL, потому что мне, возможно, придется фильтровать и новые столбцы.
  3. Добавьте столбец 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).

    Если мне нужен профиль для чего-то другого (например, группы), мне нужно добавить соответствующиеСоединительные таблицы.

Я хочу иметь хороший дизайн базы данных с производительными поисками.Обычно мне нужен собственный профиль пользователя отдельно или вместе с изменениями, внесенными другим пользователем.Какой из подходов является лучшим в отношении производительности поиска и обновления и обслуживания?Есть ли другой лучший дизайн, который я пропустил?

Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...