postgresql 如何在prisma中将约会与关系联系起来?

sbtkgmzw  于 12个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(107)

我正试图使一个数据库与多对多的关系,用户和职级,其中一些职级可以暂时分配。我遇到的问题是,我不知道如何将排名过期的时间戳与分配给用户的实际排名联系起来。这是我建立的模型(不包括其他属性,如姓名,电子邮件等):

model User {
  id            Int      @id @default(autoincrement())
  ranks         Rank[]
  ...
}

model Rank {
  name        String @id
  users       User[]
  ...
}

任何建议都很感激!
我不是所有太有经验的棱镜,所以我没有很多创造性的解决方案。我想做一个单独的model来代替关系,充当一种中间人。我也尝试了types的东西,但由于它们的限制,没有工作。

up9lanfz

up9lanfz1#

这是一个糟糕的数据模型,您如何知道并强制users.rank[]仅引用那些在rank.users[]中具有相应条目的数据?对于多:多关系,一个更好的、常见的解决方案是创建一个引用两者的解析表。所以类似于(我只使用Postgres DDL,因为我不使用prisma或任何其他orm,但翻译应该是直接的。

create table users (
  id          int generated always as identity
                  primary key  
  ... 
);

create table ranks (
  id          int generated always as identity
                  primary key
 ,name        text
  ...
);

-- resolution table 
create table user_rank ( 
  user_id     int  not null 
                   references users(id)
 ,rank_id     int  not null 
                   references ranks(id)
 ,assign_date date not null 
                   default current_date
 ,expiry_date date not null 
                   default '-infinity'::date   
 ,constraint  user_rank_pk
                   primary key (user_id, rank_id) 
);

如图所示,您现在可以将任何交叉点数据添加到分辨率表中。如果您需要维护user_rank的完整历史记录,只需将assign_date添加到PK中。

相关问题