【问题标题】:PostgreSQL model for user with multiple profiles具有多个配置文件的用户的 PostgreSQL 模型
【发布时间】:2018-06-07 19:46:07
【问题描述】:

一个用户可以有 3 种类型的配置文件:A、B、C

对于每种类型的个人资料,用户可以有不同的名称、照片集和描述。

这应该如何建模?

  • 将主要一次由一种类型获取,例如获取用户的 A 个人资料
  • 字段未过滤,例如无过滤 where 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}}

【问题讨论】:

    标签: sql postgresql database-design


    【解决方案1】:

    如果您要拥有一组固定的不同配置文件,那么发挥关系数据库的优势应该会导致您选择“加入另一个表”选项。

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

    【讨论】:

    • 您是在建议我在“加入另一个表”选项中所拥有的内容,还是您的意思是像 @Gordon Linoff 所建议的那样是一对多或联结表?
    • 您的“加入另一个表”选项实际上是在创建一个联结表('profile' 表)
    • 另一个答案使用经典的多对多解决方案创建了一个非常灵活的选项,但是您在这里有一个一对固定的数字关系,您希望如何解决它取决于您。
    【解决方案2】:

    假设所有profile都一样,那么我首先想到的是两张表:

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

    【讨论】:

    • 我想我喜欢这个答案。是的,所有配置文件类型都是相同的,并且具有这 3 列:名称、照片、描述。看起来这也会更灵活,例如,如果我决定添加更多配置文件类型,例如C、D、E(很可能不会,但仍然如此)。这会比 3 个具有相同列的不同表更好,对吧?
    • @kayla 。 . .如果您最有可能添加更多等效配置文件,那么联结表是正确的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 2014-12-17
    • 2015-06-28
    相关资源
    最近更新 更多