如何将打字稿界面转换为棱镜模型

Posted

技术标签:

【中文标题】如何将打字稿界面转换为棱镜模型【英文标题】:How to convert typescript interface into prisma model 【发布时间】:2021-12-07 17:39:58 【问题描述】:

我正在使用 psql 数据库尝试 Prisma,但我在数据建模方面并不擅长 ^^

我正在尝试将此 typescript 界面(简化)转换为 psql 数据库的 prisma 模型

export enum StarterEnum 
  MANUAL,
  ELECTRIC,
  DUAL,


interface StarterEngine 
  name: StarterEnum;
  weight: number;


interface PowerEngine 
  hp: number;
  rpm: number;


export interface Engine 
  id: string;
  brand: string;
  model: string;
  power?: PowerEngine;
  starter?: StarterEngine[];


StarterEngine 和 PowerEngine 仅特定于一个引擎,关系表对于该引擎是必需的,或者有一种解决方案可以将所有引擎都保存在一个表中?

这是我的实际模型(但有两个表),power_hp 和 power_rpm 需要链接(如果至少填写一个,则必须链接)

enum StarterEnum 
  MANUAL
  ELECTRIC
  DUAL


model Starter 
  id       String      @id @default(cuid())
  name     StarterEnum
  weight   Float
  Engine   Engine?     @relation(fields: [engineId], references: [id])
  engineId String?


model Engine 
  id        String    @id @default(cuid())
  brand     String
  model     String
  power_hp  Float
  power_rpm Float
  Starter   Starter[]

谢谢大家

【问题讨论】:

您是在说“所有在一个表中”,但每个引擎都可以有一个启动引擎列表?如果它是一对多的关系(每个引擎都有多个启动器),那么将它们放在单独的表中不是很好吗? (我对棱镜了解不多,所以这可能只是误解了这个问题) 是的,每个引擎都可以有多个启动器,但是一个启动器仅适用于一个引擎,我只是想知道是否可以将其存储在关系表的一个表中是强制性的 我不认为 typescript 有区分 one->many vs many->many 的概念,因为这意味着存储数据而不是正确输入数据,所以如果你是尝试在打字稿中编码这种“多个引擎不应引用启动引擎”逻辑,您将找不到任何成功。 【参考方案1】:

根据您的描述,听起来您需要将其拆分为多个表格。原因:

    如果至少存在一个,则 RPM 和 HP 是强制性的。为了避免在 API 层上进行验证的边缘情况,请将其设为一对一的可选关系,以便您可以直接在数据库中存储或跳过它们。

    在您提到的 cmets 上,一个引擎可能有多个启动器。那么,starter 必须是一对多的关系。

注意:Starter 和 Power 不需要有独立的 ID。使用它们引用的引擎的 id 会更简单、更清晰。 在 power 的情况下,它只能是一个 Engine,因此您可以使用关系的相同 id。 在启动器的情况下,您有与枚举不同的类型。并且,假设它们不能重复,您可以将其与引擎 ID 一起用作复合键。否则,添加一个独立的 id。 另外,我建议您始终为 id 设置默认值。这将在以后创建应用程序时为您节省时间。

这是架构:

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client 
  provider = "prisma-client-js"


datasource db 
  provider = "postgresql"
  url      = env("DATABASE_URL")


model Engine 
  id       String          @id @default(cuid())
  brand    String
  model    String
  starters EngineStarter[]
  power    EnginePower?


model EngineStarter 
  engineId String
  engine   Engine      @relation(fields: [engineId], references: [id])
  type     StarterType
  weight   Float

  @@id([engineId, type])


model EnginePower 
  engineId String @id
  engine   Engine @relation(fields: [engineId], references: [id])
  hp       Float
  rpm      Float


enum StarterType 
  MANUAL
  ELECTRIC
  DUAL


【讨论】:

以上是关于如何将打字稿界面转换为棱镜模型的主要内容,如果未能解决你的问题,请参考以下文章

打字稿:如何将字符串转换为类型

打字稿:将 HTMLElement 转换为节点

如何将这些对象转换为打字稿中的数组

将firebase json转换为打字稿数组

将打字稿枚举转换为枚举数组

如何将 C# 正则表达式转换为打字稿正则表达式?