繁体   English   中英

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

[英]How to convert typescript interface into prisma model

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

我正在尝试将此打字稿接口(简化)转换为 psql 数据库的棱镜模型

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[]
}

谢谢大家

从您的描述来看,您似乎需要将其拆分为多个表格。 原因:

  1. 如果至少存在 RPM 和 HP,则必须使用 RPM 和 HP。 为了避免在 API 层上验证边缘情况,请将其设为一对一的可选关系,以便您可以直接在数据库中存储或跳过它们。

  2. 在您提到的评论中,一个引擎可能有多个启动器。 那么,starter 必须是一对多的关系。

注意:Starter 和 Power 不需要有独立的 ID。 使用他们引用的引擎的 id 会更简单、更清晰。 在 power 的情况下,它只能是一个 Engine,因此您可以使用关系的相同 id。 在 starter 的情况下,您有与 enum 不同的类型。 而且,假设它们不能重复,您可以将其用作与引擎 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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM