2025-05-30 11:32:39 +08:00
|
|
|
|
// 优化后的架构 - 数据中台 v4.0 (完全通用化)
|
|
|
|
|
|
2025-05-26 19:56:34 +08:00
|
|
|
|
generator client {
|
|
|
|
|
provider = "prisma-client-js"
|
|
|
|
|
binaryTargets = ["native", "debian-openssl-1.1.x"]
|
|
|
|
|
output = "../generated/prisma"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
datasource db {
|
|
|
|
|
provider = "postgres"
|
|
|
|
|
url = env("DATABASE_URL")
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-30 11:32:39 +08:00
|
|
|
|
// ============= 数据源层 =============
|
|
|
|
|
model DataSource {
|
|
|
|
|
id String @id @default(cuid())
|
|
|
|
|
name String
|
|
|
|
|
code String @unique
|
|
|
|
|
type SourceType
|
|
|
|
|
config Json // 连接配置
|
|
|
|
|
description String?
|
|
|
|
|
status Status @default(ACTIVE)
|
|
|
|
|
|
|
|
|
|
// 元数据版本管理
|
|
|
|
|
schemaVersion String? @default("1.0")
|
|
|
|
|
lastSynced DateTime?
|
|
|
|
|
|
|
|
|
|
// 关联
|
|
|
|
|
pipelines Pipeline[]
|
|
|
|
|
|
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
|
updatedAt DateTime @updatedAt
|
|
|
|
|
|
|
|
|
|
@@map("data_sources")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ============= 统一流水线层 =============
|
|
|
|
|
model Pipeline {
|
|
|
|
|
id String @id @default(cuid())
|
|
|
|
|
name String
|
|
|
|
|
type PipelineType // SYNC | TRANSFORM | STREAM | HYBRID
|
|
|
|
|
schedule String? // Cron表达式
|
|
|
|
|
config Json // 流水线配置
|
|
|
|
|
description String?
|
|
|
|
|
status Status @default(ACTIVE)
|
|
|
|
|
|
|
|
|
|
// 关联数据源(可选)
|
|
|
|
|
dataSource DataSource? @relation(fields: [dataSourceId], references: [id])
|
|
|
|
|
dataSourceId String?
|
|
|
|
|
|
|
|
|
|
// 执行记录
|
|
|
|
|
executions PipelineExecution[]
|
|
|
|
|
|
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
|
updatedAt DateTime @updatedAt
|
|
|
|
|
|
|
|
|
|
@@map("pipelines")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 统一执行记录
|
|
|
|
|
model PipelineExecution {
|
|
|
|
|
id String @id @default(cuid())
|
|
|
|
|
executionId String @unique
|
|
|
|
|
status ExecutionStatus @default(PENDING)
|
|
|
|
|
|
|
|
|
|
// 统计信息
|
|
|
|
|
inputRecords Int @default(0)
|
|
|
|
|
outputRecords Int @default(0)
|
|
|
|
|
errorRecords Int @default(0)
|
|
|
|
|
|
|
|
|
|
// 时间信息
|
|
|
|
|
startedAt DateTime @default(now())
|
|
|
|
|
completedAt DateTime?
|
|
|
|
|
duration Int? // 毫秒
|
|
|
|
|
|
|
|
|
|
// 元数据
|
|
|
|
|
metadata Json? // 灵活的元数据存储
|
|
|
|
|
errorMsg String?
|
|
|
|
|
|
|
|
|
|
// 关联
|
|
|
|
|
pipeline Pipeline @relation(fields: [pipelineId], references: [id])
|
|
|
|
|
pipelineId String
|
|
|
|
|
|
|
|
|
|
// 产生的数据资产
|
|
|
|
|
dataAssets DataAsset[]
|
|
|
|
|
|
|
|
|
|
// 数据血缘
|
|
|
|
|
lineageRecords LineageRecord[]
|
|
|
|
|
|
|
|
|
|
@@map("pipeline_executions")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ============= 数据资产层 =============
|
|
|
|
|
model DataAsset {
|
|
|
|
|
id String @id @default(cuid())
|
|
|
|
|
assetId String @unique
|
|
|
|
|
name String
|
|
|
|
|
type AssetType @default(BATCH)
|
|
|
|
|
format DataFormat @default(PARQUET)
|
|
|
|
|
|
|
|
|
|
// 存储信息(支持多种存储)
|
|
|
|
|
storageConfig Json // 统一存储配置
|
|
|
|
|
|
|
|
|
|
// 元数据管理
|
|
|
|
|
schema Json?
|
|
|
|
|
partitions Json? // 分区信息
|
|
|
|
|
size BigInt? // 数据大小
|
|
|
|
|
recordCount BigInt? // 记录数
|
|
|
|
|
|
|
|
|
|
// 数据质量
|
|
|
|
|
qualityScore Float? // 0-1之间的质量分数
|
|
|
|
|
|
|
|
|
|
// 关联
|
|
|
|
|
execution PipelineExecution? @relation(fields: [executionId], references: [id])
|
|
|
|
|
executionId String?
|
|
|
|
|
|
|
|
|
|
// 查询记录
|
|
|
|
|
queries Query[]
|
|
|
|
|
|
|
|
|
|
status AssetStatus @default(ACTIVE)
|
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
|
updatedAt DateTime @updatedAt
|
|
|
|
|
|
|
|
|
|
@@index([type, status])
|
|
|
|
|
@@index([createdAt])
|
|
|
|
|
@@map("data_assets")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ============= 查询层 =============
|
|
|
|
|
model Query {
|
|
|
|
|
id String @id @default(cuid())
|
|
|
|
|
queryId String @unique
|
|
|
|
|
sql String
|
|
|
|
|
engine QueryEngine @default(DUCKDB)
|
|
|
|
|
|
|
|
|
|
// 执行信息
|
|
|
|
|
status QueryStatus @default(PENDING)
|
|
|
|
|
resultCount BigInt?
|
|
|
|
|
resultPath String?
|
|
|
|
|
duration Int? // 毫秒
|
|
|
|
|
errorMsg String?
|
|
|
|
|
|
|
|
|
|
// 查询标签
|
|
|
|
|
tags Json?
|
|
|
|
|
|
|
|
|
|
// 关联资产
|
|
|
|
|
dataAsset DataAsset @relation(fields: [assetId], references: [id])
|
|
|
|
|
assetId String
|
|
|
|
|
|
|
|
|
|
// 审计信息
|
|
|
|
|
userId String? // 执行用户
|
|
|
|
|
|
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
|
completedAt DateTime?
|
|
|
|
|
|
|
|
|
|
@@index([status, createdAt])
|
|
|
|
|
@@map("queries")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ============= 通用实体层 =============
|
|
|
|
|
|
|
|
|
|
// 通用实体模型(支持优雅的树形层级)
|
|
|
|
|
model Entity {
|
|
|
|
|
id String @id @default(cuid())
|
|
|
|
|
code String @unique
|
|
|
|
|
name String
|
|
|
|
|
type EntityType // PERSON, EQUIPMENT, FACILITY, MATERIAL, ORGANIZATION等
|
|
|
|
|
attributes Json? // 灵活的属性存储
|
|
|
|
|
status Status @default(ACTIVE)
|
|
|
|
|
|
|
|
|
|
// 树形层级关系(直接支持)
|
|
|
|
|
parentId String?
|
|
|
|
|
parent Entity? @relation("EntityTree", fields: [parentId], references: [id])
|
|
|
|
|
children Entity[] @relation("EntityTree")
|
|
|
|
|
|
|
|
|
|
// 层级路径(用于快速查询)
|
|
|
|
|
path String? // 如: "/org1/dept1/team1" 便于层级查询
|
|
|
|
|
level Int? // 层级深度,根节点为0
|
|
|
|
|
|
|
|
|
|
// 作为源实体的关系(非树形关系)
|
|
|
|
|
sourceRelations EntityRelation[] @relation("SourceEntity")
|
|
|
|
|
// 作为目标实体的关系
|
|
|
|
|
targetRelations EntityRelation[] @relation("TargetEntity")
|
|
|
|
|
|
|
|
|
|
// 数据血缘
|
|
|
|
|
lineageRecords LineageRecord[]
|
|
|
|
|
|
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
|
updatedAt DateTime @updatedAt
|
|
|
|
|
|
|
|
|
|
@@index([type, status])
|
|
|
|
|
@@index([code])
|
|
|
|
|
@@index([type, code])
|
|
|
|
|
@@index([parentId])
|
|
|
|
|
@@index([path])
|
|
|
|
|
@@index([type, parentId])
|
|
|
|
|
@@index([level])
|
|
|
|
|
@@map("entities")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ============= 通用关系层 =============
|
|
|
|
|
|
|
|
|
|
// 通用实体关系表(处理非树形的复杂关系)
|
|
|
|
|
model EntityRelation {
|
|
|
|
|
id String @id @default(cuid())
|
|
|
|
|
sourceId String // 源实体ID
|
|
|
|
|
targetId String // 目标实体ID
|
|
|
|
|
relationship String // 关系类型
|
|
|
|
|
|
|
|
|
|
// 关系属性
|
|
|
|
|
attributes Json? // 关系属性:权限级别、时间范围等
|
|
|
|
|
startDate DateTime?
|
|
|
|
|
endDate DateTime?
|
|
|
|
|
|
|
|
|
|
// 关系元数据
|
|
|
|
|
metadata Json? // 其他元数据
|
|
|
|
|
|
|
|
|
|
// 关联实体
|
|
|
|
|
sourceEntity Entity @relation("SourceEntity", fields: [sourceId], references: [id])
|
|
|
|
|
targetEntity Entity @relation("TargetEntity", fields: [targetId], references: [id])
|
|
|
|
|
|
|
|
|
|
status Status @default(ACTIVE)
|
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
|
updatedAt DateTime @updatedAt
|
|
|
|
|
|
|
|
|
|
@@unique([sourceId, targetId, relationship])
|
|
|
|
|
@@index([sourceId])
|
|
|
|
|
@@index([targetId])
|
|
|
|
|
@@index([relationship])
|
|
|
|
|
@@index([sourceId, relationship])
|
|
|
|
|
@@index([targetId, relationship])
|
|
|
|
|
@@index([relationship, status])
|
|
|
|
|
@@map("entity_relations")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ============= 优化的血缘层 =============
|
|
|
|
|
model LineageRecord {
|
|
|
|
|
id String @id @default(cuid())
|
|
|
|
|
sourceType String // 来源类型
|
|
|
|
|
sourceId String // 来源ID
|
|
|
|
|
targetType String // 目标类型
|
|
|
|
|
targetId String // 目标ID
|
|
|
|
|
relationship String // 关系类型: CREATE, UPDATE, DERIVE
|
|
|
|
|
|
|
|
|
|
// 元数据
|
|
|
|
|
metadata Json? // 血缘元数据
|
|
|
|
|
|
|
|
|
|
// 关联执行(可选)
|
|
|
|
|
execution PipelineExecution? @relation(fields: [executionId], references: [id])
|
|
|
|
|
executionId String?
|
|
|
|
|
|
|
|
|
|
// 关联实体(可选)
|
|
|
|
|
entity Entity? @relation(fields: [entityId], references: [id])
|
|
|
|
|
entityId String?
|
|
|
|
|
|
|
|
|
|
status LineageStatus @default(ACTIVE)
|
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
|
|
|
|
|
|
@@unique([sourceType, sourceId, targetType, targetId])
|
|
|
|
|
@@index([relationship])
|
|
|
|
|
@@map("lineage_records")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ============= 数据治理层 =============
|
|
|
|
|
model QualityRule {
|
|
|
|
|
id String @id @default(cuid())
|
|
|
|
|
name String
|
|
|
|
|
description String?
|
|
|
|
|
rule Json // 质量规则定义
|
|
|
|
|
threshold Float? // 阈值
|
|
|
|
|
|
|
|
|
|
// 应用范围
|
|
|
|
|
entityType String? // 应用的实体类型
|
|
|
|
|
entityId String? // 特定实体ID
|
|
|
|
|
|
|
|
|
|
status Status @default(ACTIVE)
|
|
|
|
|
|
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
|
updatedAt DateTime @updatedAt
|
|
|
|
|
|
|
|
|
|
@@map("quality_rules")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
model DataCatalog {
|
|
|
|
|
id String @id @default(cuid())
|
|
|
|
|
name String
|
|
|
|
|
description String?
|
|
|
|
|
tags Json? // 标签
|
|
|
|
|
owner String? // 数据负责人
|
|
|
|
|
|
|
|
|
|
// 分类
|
|
|
|
|
category String?
|
|
|
|
|
sensitivity String? // 敏感度级别
|
|
|
|
|
|
|
|
|
|
// 关联资产或实体
|
|
|
|
|
assetType String // 资产类型:DataAsset, Entity等
|
|
|
|
|
assetId String // 资产ID
|
|
|
|
|
|
|
|
|
|
status Status @default(ACTIVE)
|
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
|
updatedAt DateTime @updatedAt
|
|
|
|
|
|
|
|
|
|
@@unique([assetType, assetId])
|
|
|
|
|
@@index([category])
|
|
|
|
|
@@map("data_catalogs")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ============= 精简的权限层 =============
|
2025-05-26 19:56:34 +08:00
|
|
|
|
model User {
|
2025-05-30 11:32:39 +08:00
|
|
|
|
id String @id @default(cuid())
|
|
|
|
|
username String @unique
|
|
|
|
|
email String @unique
|
|
|
|
|
name String
|
|
|
|
|
roles Json? // 简化为JSON存储角色
|
|
|
|
|
status Status @default(ACTIVE)
|
|
|
|
|
|
|
|
|
|
createdAt DateTime @default(now())
|
|
|
|
|
updatedAt DateTime @updatedAt
|
2025-05-26 19:56:34 +08:00
|
|
|
|
|
|
|
|
|
@@map("users")
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-30 11:32:39 +08:00
|
|
|
|
// ============= 枚举定义 =============
|
|
|
|
|
enum Status {
|
|
|
|
|
ACTIVE
|
|
|
|
|
INACTIVE
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum SourceType {
|
|
|
|
|
DATABASE
|
|
|
|
|
API
|
|
|
|
|
FILE
|
|
|
|
|
ERP
|
|
|
|
|
MES
|
|
|
|
|
IOT
|
|
|
|
|
STREAM
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum PipelineType {
|
|
|
|
|
SYNC
|
|
|
|
|
TRANSFORM
|
|
|
|
|
STREAM
|
|
|
|
|
HYBRID
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum ExecutionStatus {
|
|
|
|
|
PENDING
|
|
|
|
|
RUNNING
|
|
|
|
|
SUCCESS
|
|
|
|
|
FAILED
|
|
|
|
|
CANCELLED
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum DataFormat {
|
|
|
|
|
PARQUET
|
|
|
|
|
JSON
|
|
|
|
|
CSV
|
|
|
|
|
AVRO
|
|
|
|
|
DELTA
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum AssetType {
|
|
|
|
|
BATCH
|
|
|
|
|
STREAM
|
|
|
|
|
TABLE
|
|
|
|
|
VIEW
|
|
|
|
|
MODEL
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum AssetStatus {
|
|
|
|
|
ACTIVE
|
|
|
|
|
ARCHIVED
|
|
|
|
|
DEPRECATED
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum QueryEngine {
|
|
|
|
|
DUCKDB
|
|
|
|
|
ATHENA
|
|
|
|
|
SPARK
|
|
|
|
|
TRINO
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum QueryStatus {
|
|
|
|
|
PENDING
|
|
|
|
|
RUNNING
|
|
|
|
|
SUCCESS
|
|
|
|
|
FAILED
|
|
|
|
|
CANCELLED
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum EntityType {
|
|
|
|
|
PERSON
|
|
|
|
|
EQUIPMENT
|
|
|
|
|
FACILITY
|
|
|
|
|
MATERIAL
|
|
|
|
|
ORGANIZATION
|
|
|
|
|
PROJECT
|
|
|
|
|
CUSTOM
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enum LineageStatus {
|
|
|
|
|
ACTIVE
|
|
|
|
|
ARCHIVED
|
|
|
|
|
}
|
2025-06-05 15:44:06 +08:00
|
|
|
|
model Resource {
|
|
|
|
|
id String @id @default(cuid()) @map("id")
|
|
|
|
|
title String @map("title")
|
|
|
|
|
description String? @map("description")
|
|
|
|
|
type String? @map("type")
|
|
|
|
|
fileId String @unique
|
|
|
|
|
url String?
|
|
|
|
|
meta Json? @map("meta")
|
|
|
|
|
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")
|
|
|
|
|
isPublic Boolean? @default(true) @map("is_public")
|
|
|
|
|
storageType String? @map("storage_type")
|
|
|
|
|
|
|
|
|
|
// 索引
|
|
|
|
|
@@index([type])
|
|
|
|
|
@@index([createdAt])
|
|
|
|
|
@@map("resource")
|
|
|
|
|
}
|