具有多个配置文件的用户的PostgreSQL模型

时间:2018-06-07 19:46:08

标签: sql postgresql database-design

用户可以有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 by field:

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 :(得分:1)

如果您要拥有一组固定的不同配置文件,那么播放关系数据库的强度应该会导致您选择"加入另一个表"选项。

其他每个选项都稍微灵活一点,但基本上只是一个非规范化版本。

答案 1 :(得分:0)

假设所有配置文件都相同,那么我首先想到的是两个表:

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>
);