Database Schema Designer
层级: 强大
类别: 工程
领域: 数据架构 / 后端
根据需求设计关系型数据库模式,并生成迁移脚本、TypeScript/Python类型、种子数据、行级安全策略和索引。支持多租户、软删除、审计追踪、版本控制和多态关联。
给定需求:
用户可以创建项目。每个项目包含任务。任务可以添加标签。任务可以分配给用户。我们需要完整的审计追踪。
提取实体:
User, Project, Task, Label, TaskLabel(关联表), TaskAssignment, AuditLog
User 1──* Project (所有者)
Project 1──* Task
Task ── Label (通过TaskLabel)
Task ── User (通过TaskAssignment)
User 1──* AuditLog
sql
-- 启用行级安全
ALTER TABLE tasks ENABLE ROW LEVEL SECURITY;
ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
-- 创建应用角色
CREATE ROLE app_user;
-- 用户只能查看其组织项目中的任务
CREATE POLICY tasksorgisolation ON tasks
FOR ALL TO app_user
USING (
project_id IN (
SELECT p.id FROM projects p
JOIN organizationmembers om ON om.organizationid = p.organization_id
WHERE om.userid = currentsetting(app.currentuserid)::text
)
);
-- 软删除:永不显示已删除记录
CREATE POLICY tasksnodeleted ON tasks
FOR SELECT TO app_user
USING (deleted_at IS NULL);
-- 仅任务创建者或管理员可删除
CREATE POLICY tasksdeletepolicy ON tasks
FOR DELETE TO app_user
USING (
createdbyid = currentsetting(app.currentuser_id)::text
OR EXISTS (
SELECT 1 FROM organization_members om
JOIN projects p ON p.organizationid = om.organizationid
WHERE p.id = tasks.project_id
AND om.userid = currentsetting(app.currentuserid)::text
AND om.role IN (owner, admin)
)
);
-- 设置用户上下文(每次请求开始时调用)
SELECT setconfig(app.currentuser_id, $1, true);
typescript
// db/seed.ts
import { faker } from @faker-js/faker
import { db } from ./client
import { organizations, users, projects, tasks } from ./schema
import { createId } from @paralleldrive/cuid2
import { hashPassword } from ../src/lib/auth
async function seed() {
console.log(正在填充数据库...)
// 创建组织
const [org] = await db.insert(organizations).values({
id: createId(),
name: acme-corp,
slug: acme,
plan: growth,
}).returning()
// 创建用户
const adminUser = await db.insert(users).values({
id: createId(),
email: admin@acme.com,
name: alice-admin,
passwordHash: await hashPassword(password123),
}).returning().then(r => r[0])
// 创建项目
const projectsData = Array.from({ length: 3 }, () => ({
id: createId(),
organizationId: org.id,
ownerId: adminUser.id,
name: fakercompanycatchphrase
description: faker.lorem.paragraph(),
status: active as const,
}))
const createdProjects = await db.insert(projects).values(projectsData).returning()
// 为每个项目创建任务
for (const project of createdProjects) {
const tasksData = Array.from({ length: faker.number.int({ min: 5, max: 20 }) }, (_, i) => ({
id: createId(),
projectId: project.id,
title: faker.hacker.phrase(),
description: faker.lorem.sentences(2),
status: faker.helpers.arrayElement([todo, in_progress, done] as const),
priority: faker.helpers.arrayElement([low, medium, high] as const),
position: i * 1000,
createdById: adminUser.id,
updatedById: adminUser.id,
}))
await db.insert(tasks).values(tasksData)
}
console.log(✅ 已填充:1个组织,${projectsData.length}个项目,任务)
}
seed().catch(console.error).finally(() => process.exit(0))
erDiagram
Organization ||--o{ OrganizationMember : 拥有
Organization ||--o{ Project : 拥有
User ||--o{ OrganizationMember : 加入
User ||--o{ Task : 创建者
Project ||--o{ Task : 包含
Task ||--o{ TaskAssignment : 拥有
Task ||--o{ TaskLabel : 拥有
Task ||--o{ Comment : 拥有
Task ||--o{ Attachment : 拥有
Label ||--o{ TaskLabel : 应用于
User ||--o{ TaskAssignment : 分配
Organization {
string id PK
string name
string slug
string plan
}
Task {
string id PK
string project_id FK
string title
string status
string priority
timestamp due_date
timestamp deleted_at
int version
}
从Prisma生成:
bash
npx prisma-erd-generator
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 database-schema-designer-1776173110 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 database-schema-designer-1776173110 技能
skillhub install database-schema-designer-1776173110
文件大小: 6.69 KB | 发布时间: 2026-4-15 11:18