1

这更像是一个设计问题,而不是一个编码问题。假设以下架构:

// schema.prisma
// Solution 1

model Entity {
  id    Int          @id @default(autoincrement())
  attrs EntityAttr[] 
}

model EntityAttr {
  id       Int         @id @default(autoincrement())
  value    Json        // or String, doesnt matter much here
                       // the point is I need to attach info on the
                       // join table of this relation
  attr     Attr        @relation(fields: [attrId], references: [id])
  entity   Entity      @relation(fields: [entityId], references: [id])

  entityId Int
  attrId   Int

  @@unique([entityId, attrId])
}

model Attr {
  id       Int          @id @default(autoincrement())
  entities EntityAttr[]   
}
// Solution 2
model Entity {
  id          Int          @id @default(autoincrement())
  dateAttrs   DateAttr[]
  recordAttrs RecordAttr[]
  // ... this pattern could continue for more Attr-like models
}

model DateAttr {
  id     Int       @id @default(autoincrement())
  name   String
  entity Entity    @relation(fields: [entityId], references: [id])
  value  DateTime  // Stronger typing in generated code
}

model RecordAttr {
  // ... define another Entity @relation(...)
  name   String
  value  String
  // ...
}

// ... and so on

Please note that the schema might not be 100% complete or accurate. It is mainly to get the point across.

解决方案 1 的优点是冗余和数据库中的表数量显着减少(取决于Attrs 的数量)。它的失败来自于令人困惑的查询*、可能的特定案例类型转换以及value每个Attr类似模型的字段没有代码完成。

*prisma通过混淆,我的意思是在使用自定义连接表时,简化 mn 查询的选项在功能上被禁用(例如EntityAttr

解决方案 2 有其优点,生成的代码会为字段生成更强类型的代码value,但是它属于生成的表的数量(我实际上不知道更多的表是好事还是坏事,所有我认为如果你有相似的值,它们应该在同一个表中)。

你会在我的鞋子里做什么?

4

1 回答 1

0

有时,用例不能概括为抽象并具有类型。

如果您控制它们并且具有有限的属性,请确保您可以将每个属性创建为单独的表,每个表都有自己的模式。

有时需要更多的自由或块是动态的。

用例:构建像“notion.so”这样的块文档编辑器,您希望让用户创建自定义块或配置它们。

你可以这样做:

model Document {
    id     String  @id
    blocks Block[]
}

model Block {
    id           String    @id
    value        Json
    index        Int
    customConfig Json?
    document     Document? @relation(fields: [documentID], references: [id])
    documentID   String?
    blockType    BlockType @relation(fields: [blockTypeID], references: [id])
    blockTypeID  String
}

model BlockType {
    id     String  @id
    name   String
    config Json
    blocks Block[]
}

其中配置和自定义配置可以包含 html、自定义 css 类、链接属性颜色或任何内容。

使用类型脚本,您可以创建 block.types.ts 并为配置添加不同的假设模板。

我希望我对你有用,总而言之,这取决于要求:>)

于 2021-09-30T08:09:26.850 回答