doctor-mail/packages/common/prisma/schema.prisma

294 lines
11 KiB
Plaintext
Raw Normal View History

2024-09-03 20:19:33 +08:00
// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema
generator client {
2024-12-30 08:26:40 +08:00
provider = "prisma-client-js"
2024-09-03 20:19:33 +08:00
}
datasource db {
2024-12-30 08:26:40 +08:00
provider = "postgresql"
url = env("DATABASE_URL")
2024-09-03 20:19:33 +08:00
}
model Taxonomy {
2024-12-30 13:44:30 +08:00
id String @id @default(cuid())
2024-12-30 08:26:40 +08:00
name String @unique
slug String @unique @map("slug")
deletedAt DateTime? @map("deleted_at")
createdAt DateTime @default(now()) @map("created_at")
terms Term[]
objectType String[] @map("object_type")
order Float? @map("order")
2024-09-03 20:19:33 +08:00
2024-12-30 08:26:40 +08:00
@@index([order, deletedAt])
@@map("taxonomy")
2024-09-03 20:19:33 +08:00
}
model Term {
2025-01-25 00:37:59 +08:00
id String @id @default(cuid())
2024-12-30 08:26:40 +08:00
name String
2025-01-25 00:37:59 +08:00
posts Post[]
taxonomy Taxonomy? @relation(fields: [taxonomyId], references: [id])
taxonomyId String? @map("taxonomy_id")
order Float? @map("order")
2024-12-30 08:26:40 +08:00
description String?
2025-01-25 00:37:59 +08:00
parentId String? @map("parent_id")
2024-12-30 08:26:40 +08:00
parent Term? @relation("ChildParent", fields: [parentId], references: [id], onDelete: Cascade)
children Term[] @relation("ChildParent")
ancestors TermAncestry[] @relation("DescendantToAncestor")
descendants TermAncestry[] @relation("AncestorToDescendant")
domainId String? @map("domain_id")
domain Department? @relation("TermDom", fields: [domainId], references: [id])
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at")
createdBy String? @map("created_by")
depts Department[] @relation("department_term")
hasChildren Boolean? @default(false) @map("has_children")
@@index([name]) // 对name字段建立索引以加快基于name的查找速度
@@index([parentId]) // 对parentId字段建立索引以加快基于parentId的查找速度
@@map("term")
2024-09-03 20:19:33 +08:00
}
model TermAncestry {
2024-12-30 13:44:30 +08:00
id String @id @default(cuid())
2024-12-30 08:26:40 +08:00
ancestorId String? @map("ancestor_id")
descendantId String @map("descendant_id")
relDepth Int @map("rel_depth")
ancestor Term? @relation("AncestorToDescendant", fields: [ancestorId], references: [id])
descendant Term @relation("DescendantToAncestor", fields: [descendantId], references: [id])
2024-09-03 20:19:33 +08:00
2024-12-30 08:26:40 +08:00
// 索引建议
@@index([ancestorId]) // 针对祖先的查询
@@index([descendantId]) // 针对后代的查询
@@index([ancestorId, descendantId]) // 组合索引,用于查询特定的祖先-后代关系
@@index([relDepth]) // 根据关系深度的查询
@@map("term_ancestry")
2024-09-03 20:19:33 +08:00
}
model Staff {
2024-12-30 13:44:30 +08:00
id String @id @default(cuid())
2024-12-30 08:26:40 +08:00
showname String? @map("showname")
username String @unique @map("username")
avatar String? @map("avatar")
password String? @map("password")
phoneNumber String? @unique @map("phone_number")
domainId String? @map("domain_id")
deptId String? @map("dept_id")
2024-12-30 13:44:30 +08:00
domain Department? @relation("DomainStaff", fields: [domainId], references: [id])
department Department? @relation("DeptStaff", fields: [deptId], references: [id])
order Float?
2024-09-03 20:19:33 +08:00
2024-12-30 08:26:40 +08:00
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
enabled Boolean? @default(true)
deletedAt DateTime? @map("deleted_at")
officerId String? @map("officer_id")
2024-09-03 20:19:33 +08:00
2024-12-31 15:57:32 +08:00
visits Visit[]
2025-01-22 15:28:13 +08:00
ownedPosts Post[] @relation("post_author")
receviedPosts Post[] @relation("post_receiver")
sentMsgs Message[] @relation("message_sender")
receivedMsgs Message[] @relation("message_receiver")
2024-12-31 15:57:32 +08:00
registerToken String?
2025-01-03 09:24:46 +08:00
ownedResources Resource[]
2025-01-25 00:37:59 +08:00
meta Json?
2024-12-30 08:26:40 +08:00
@@index([officerId])
@@index([deptId])
@@index([domainId])
@@index([username])
@@index([order])
@@map("staff")
2024-09-03 20:19:33 +08:00
}
model Department {
2024-12-30 13:44:30 +08:00
id String @id @default(cuid())
name String
order Float?
ancestors DeptAncestry[] @relation("DescendantToAncestor")
descendants DeptAncestry[] @relation("AncestorToDescendant")
parentId String? @map("parent_id")
parent Department? @relation("ChildParent", fields: [parentId], references: [id])
children Department[] @relation("ChildParent")
domainId String? @map("domain_id")
domainTerms Term[] @relation("TermDom")
deletedAt DateTime? @map("deleted_at")
isDomain Boolean? @default(false) @map("is_domain")
domainStaffs Staff[] @relation("DomainStaff")
deptStaffs Staff[] @relation("DeptStaff")
terms Term[] @relation("department_term")
hasChildren Boolean? @default(false) @map("has_children")
2024-12-30 08:26:40 +08:00
@@index([parentId])
@@index([isDomain])
@@index([name])
@@index([order])
@@map("department")
2024-09-03 20:19:33 +08:00
}
model DeptAncestry {
2024-12-30 13:44:30 +08:00
id String @id @default(cuid())
2024-12-30 08:26:40 +08:00
ancestorId String? @map("ancestor_id")
descendantId String @map("descendant_id")
relDepth Int @map("rel_depth")
ancestor Department? @relation("AncestorToDescendant", fields: [ancestorId], references: [id])
descendant Department @relation("DescendantToAncestor", fields: [descendantId], references: [id])
// 索引建议
@@index([ancestorId]) // 针对祖先的查询
@@index([descendantId]) // 针对后代的查询
@@index([ancestorId, descendantId]) // 组合索引,用于查询特定的祖先-后代关系
@@index([relDepth]) // 根据关系深度的查询
@@map("dept_ancestry")
2024-09-03 20:19:33 +08:00
}
model RoleMap {
2024-12-30 13:44:30 +08:00
id String @id @default(cuid())
2024-12-30 08:26:40 +08:00
objectId String @map("object_id")
roleId String @map("role_id")
domainId String? @map("domain_id")
objectType String @map("object_type")
role Role @relation(fields: [roleId], references: [id])
@@index([domainId])
@@index([objectId])
@@map("rolemap")
2024-09-03 20:19:33 +08:00
}
model Role {
2024-12-30 13:44:30 +08:00
id String @id @default(cuid())
2024-12-30 08:26:40 +08:00
name String @unique @map("name")
permissions String[] @default([]) @map("permissions")
roleMaps RoleMap[]
system Boolean? @default(false) @map("system")
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime @updatedAt @map("updated_at")
deletedAt DateTime? @map("deleted_at")
@@map("role")
}
model AppConfig {
2024-12-30 13:44:30 +08:00
id String @id @default(cuid())
2024-12-30 08:26:40 +08:00
slug String @unique
title String?
description String?
meta Json?
@@map("app_config")
}
model Post {
2024-12-31 15:57:32 +08:00
// 字符串类型字段
2025-01-25 00:37:59 +08:00
id String @id @default(cuid()) // 帖子唯一标识,使用 cuid() 生成默认值
type String? // 帖子类型,可为空
state String? // 状态 未读、处理中、已回答
title String? // 帖子标题,可为空
content String? // 帖子内容,可为空
2024-12-31 15:57:32 +08:00
domainId String? @map("domain_id")
2025-01-25 00:37:59 +08:00
term Term? @relation(fields: [termId], references: [id])
termId String? @map("term_id")
2024-12-31 15:57:32 +08:00
// 日期时间类型字段
createdAt DateTime @default(now()) @map("created_at")
2025-01-24 00:19:02 +08:00
updatedAt DateTime @map("updated_at")
2024-12-31 15:57:32 +08:00
deletedAt DateTime? @map("deleted_at") // 删除时间,可为空
// 关系类型字段
2025-01-21 19:48:54 +08:00
authorId String? @map("author_id")
2025-01-22 15:28:13 +08:00
author Staff? @relation("post_author", fields: [authorId], references: [id]) // 帖子作者,关联 Staff 模型
visits Visit[] // 访问记录,关联 Visit 模型
2025-01-25 00:37:59 +08:00
views Int @default(0)
likes Int @default(0)
2025-01-24 00:19:02 +08:00
2025-01-25 00:37:59 +08:00
receivers Staff[] @relation("post_receiver")
parentId String? @map("parent_id")
parent Post? @relation("PostChildren", fields: [parentId], references: [id]) // 父级帖子,关联 Post 模型
children Post[] @relation("PostChildren") // 子级帖子列表,关联 Post 模型
2024-12-31 15:57:32 +08:00
resources Resource[] // 附件列表
2025-01-24 11:39:51 +08:00
isPublic Boolean? @default(true) @map("is_public")
2025-01-25 00:37:59 +08:00
meta Json? // 签名 和 IP 和 tags
2024-12-30 08:26:40 +08:00
// 复合索引
@@index([type, domainId]) // 类型和域组合查询
@@index([authorId, type]) // 作者和类型组合查询
@@index([parentId, type]) // 父级帖子和创建时间索引
// 时间相关索引
@@index([createdAt]) // 按创建时间倒序索引
@@index([updatedAt]) // 按更新时间倒序索引
}
model Message {
2024-12-31 15:57:32 +08:00
id String @id @default(cuid())
url String?
intent String?
option Json?
senderId String? @map("sender_id")
type String?
sender Staff? @relation(name: "message_sender", fields: [senderId], references: [id])
title String?
content String?
receivers Staff[] @relation("message_receiver")
visits Visit[]
createdAt DateTime @default(now()) @map("created_at")
updatedAt DateTime? @updatedAt @map("updated_at")
2025-01-21 19:48:54 +08:00
2024-12-31 15:57:32 +08:00
@@index([type, createdAt])
2024-12-30 08:26:40 +08:00
@@map("message")
}
2025-01-21 19:48:54 +08:00
2024-12-30 08:26:40 +08:00
model Visit {
2025-01-21 19:48:54 +08:00
id String @id @default(cuid()) @map("id")
type String?
views Int @default(1) @map("views")
// sourceIP String? @map("source_ip")
2024-12-31 15:57:32 +08:00
// 关联关系
2025-01-25 00:37:59 +08:00
visitorId String? @map("visitor_id")
visitor Staff? @relation(fields: [visitorId], references: [id])
2025-01-21 19:48:54 +08:00
postId String? @map("post_id")
post Post? @relation(fields: [postId], references: [id])
message Message? @relation(fields: [messageId], references: [id])
messageId String? @map("message_id")
createdAt DateTime @default(now()) @map("created_at") // 创建时间
updatedAt DateTime @updatedAt @map("updated_at") // 更新时间
2025-01-22 15:28:13 +08:00
meta Json?
2025-01-21 19:48:54 +08:00
2024-12-31 15:57:32 +08:00
@@index([postId, type, visitorId])
@@index([messageId, type, visitorId])
2024-12-30 08:26:40 +08:00
@@map("visit")
2024-09-03 20:19:33 +08:00
}
2024-12-30 13:44:30 +08:00
model Resource {
2025-01-06 18:30:16 +08:00
id String @id @default(cuid()) @map("id")
title String? @map("title")
description String? @map("description")
type String? @map("type")
fileId String? @unique
url String?
2025-01-03 09:24:46 +08:00
// 元数据
2025-01-06 18:30:16 +08:00
metadata Json? @map("metadata")
2025-01-03 09:24:46 +08:00
// 处理状态控制
2025-01-06 18:30:16 +08:00
status String?
createdAt DateTime? @default(now()) @map("created_at")
updatedAt DateTime? @updatedAt @map("updated_at")
createdBy String? @map("created_by")
updatedBy String? @map("updated_by")
deletedAt DateTime? @map("deleted_at")
2025-01-22 15:28:13 +08:00
isPublic Boolean? @default(true) @map("is_public")
owner Staff? @relation(fields: [ownerId], references: [id])
ownerId String? @map("owner_id")
post Post? @relation(fields: [postId], references: [id])
postId String? @map("post_id")
2025-01-21 19:48:54 +08:00
2025-01-03 09:24:46 +08:00
// 索引
2024-12-31 15:57:32 +08:00
@@index([type])
2025-01-03 09:24:46 +08:00
@@index([createdAt])
2024-12-31 15:57:32 +08:00
@@map("resource")
2024-12-30 13:44:30 +08:00
}