如何将打字稿接口转换为棱镜模型
How to convert typescript interface into prisma model
我正在尝试将 Prisma 与 psql 数据库结合使用,但我在数据建模方面并不是很擅长 ^^
我正在尝试将此 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 仅特定于一个引擎,关系 table 是强制性的,或者有一个解决方案可以将所有引擎集成在一起 table ?
这是我的实际模型(但有两个 table)并且 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[]
}
谢谢大家
根据您的描述,您似乎需要将其拆分为多个 table。原因:
RPM 和 HP 至少有一个是强制性的。为避免在 API 层上进行验证的边缘情况,请将其设为一对一的可选关系,以便您可以直接在数据库中存储或跳过它们。
在您提到的引擎可能有多个启动器的评论中。那么,starter必须是一对多的关系。
注意:Starter和Power不需要有独立的ID。使用它们引用的引擎的 id 会更简单、更清晰。
在 power 的情况下,它只能是一个引擎,所以你可以使用关系的相同 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
}
我正在尝试将 Prisma 与 psql 数据库结合使用,但我在数据建模方面并不是很擅长 ^^
我正在尝试将此 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 仅特定于一个引擎,关系 table 是强制性的,或者有一个解决方案可以将所有引擎集成在一起 table ?
这是我的实际模型(但有两个 table)并且 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[]
}
谢谢大家
根据您的描述,您似乎需要将其拆分为多个 table。原因:
RPM 和 HP 至少有一个是强制性的。为避免在 API 层上进行验证的边缘情况,请将其设为一对一的可选关系,以便您可以直接在数据库中存储或跳过它们。
在您提到的引擎可能有多个启动器的评论中。那么,starter必须是一对多的关系。
注意:Starter和Power不需要有独立的ID。使用它们引用的引擎的 id 会更简单、更清晰。 在 power 的情况下,它只能是一个引擎,所以你可以使用关系的相同 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
}