Модель PostgreSQL для пользователя с несколькими профилями - PullRequest
0 голосов
/ 07 июня 2018

Пользователь может иметь 3 типа профилей: A, B, C

. Для каждого типа профиля пользователь может иметь свое имя, набор фотографий и описание.

Как это должно быть смоделировано?

  • будет в основном выбираться одним типом за один раз, например, получить профиль пользователя. Поля профиля
  • не фильтруются, например, без фильтрации, где name =
  • нет ролей / разрешений, о которых нужно беспокоиться
  • Пользовательский интерфейс позволяет пользователям одновременно обновлять имя, фотографии или описание для профиля

Отдельные столбцы в одной таблице:

profile
---
name_A name_B name_C photos_A photos_B photos_C description_A description_B description_C

Присоединиться к другой таблице:

profile
---
A_profile_id B_profile_id C_profile_id

A_profile
---
id name photos description

B_profile
---
id name photos description

C_profile
---
id name photos description

jsonb по полю:

profile
---
name{A,B,C} photos{A,B,C} description{A,B,C}

jsonb по типу профиля:

profile
---
A_profile{name,photos,description} B_profile{name,photos,description} C_profile{name,photos,description}

ВложеноJSONB (заманчиво ...):

profile
---
profile{A{name,photos,description},B{name,photos,description},C{name,photos,description}}

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Если предположить, что все профили одинаковы, то я сначала подумал о двух таблицах:

create table Profiles (
    profileId serial,
    . . .
);

create table Persons (
   personId serial,
   . . .
   profile_A int references profiles(profileId),
   profile_B int references profiles(profileId),
   profile_C int references profiles(profileId)
);

Хотя может быть веская причина иметь три разных столбца, вам может понадобиться также таблица соединений:

create table personProfiles (
    personProfileId serial,
    personId int references person(personId),
    profileId int references profiles(profileId),
    profileTye <whatever>
);
0 голосов
/ 07 июня 2018

Если у вас будет фиксированный набор различных профилей, то при игре в духе реляционной базы данных вы должны выбрать опцию «Присоединиться к другому столу».

Каждый из других вариантовнемного более гибкий, но по сути просто денормализованный вариант этого.

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