Loading...
Loading...
Compare original and translation side by side
Database Selection Decision Tree
═══════════════════════════════════════════════════════════
PRIMARY CONCERN?
├─ MAXIMUM FLEXIBILITY & EXTENSIONS (JSON, arrays, vector search)
│ └─ PostgreSQL
│ ├─ Serverless → Neon (scale-to-zero, database branching)
│ └─ Traditional → Self-hosted, AWS RDS, Google Cloud SQL
│
├─ EMBEDDED / EDGE DEPLOYMENT (local-first, global latency)
│ └─ SQLite or Turso
│ ├─ Global distribution → Turso (libSQL, edge replicas)
│ └─ Local-only → SQLite (embedded, zero-config)
│
├─ LEGACY SYSTEM / MYSQL REQUIRED
│ └─ MySQL
│ ├─ Serverless → PlanetScale (non-blocking migrations)
│ └─ Traditional → Self-hosted, AWS RDS, Google Cloud SQL
│
└─ RAPID PROTOTYPING
├─ Python → SQLModel (FastAPI) or SQLAlchemy 2.0
├─ TypeScript → Prisma (best DX) or Drizzle (performance)
├─ Rust → SQLx (compile-time checks)
└─ Go → sqlc (type-safe code generation)Database Selection Decision Tree
═══════════════════════════════════════════════════════════
PRIMARY CONCERN?
├─ MAXIMUM FLEXIBILITY & EXTENSIONS (JSON, arrays, vector search)
│ └─ PostgreSQL
│ ├─ Serverless → Neon (scale-to-zero, database branching)
│ └─ Traditional → Self-hosted, AWS RDS, Google Cloud SQL
│
├─ EMBEDDED / EDGE DEPLOYMENT (local-first, global latency)
│ └─ SQLite or Turso
│ ├─ Global distribution → Turso (libSQL, edge replicas)
│ └─ Local-only → SQLite (embedded, zero-config)
│
├─ LEGACY SYSTEM / MYSQL REQUIRED
│ └─ MySQL
│ ├─ Serverless → PlanetScale (non-blocking migrations)
│ └─ Traditional → Self-hosted, AWS RDS, Google Cloud SQL
│
└─ RAPID PROTOTYPING
├─ Python → SQLModel (FastAPI) or SQLAlchemy 2.0
├─ TypeScript → Prisma (best DX) or Drizzle (performance)
├─ Rust → SQLx (compile-time checks)
└─ Go → sqlc (type-safe code generation)ORM vs Query Builder Selection
═══════════════════════════════════════════════════════════
TEAM PRIORITIES?
├─ DEVELOPMENT SPEED / DEVELOPER EXPERIENCE
│ └─ ORM (abstracts SQL, handles relations automatically)
│ ├─ Python → SQLAlchemy 2.0, SQLModel
│ ├─ TypeScript → Prisma (migrations, type generation)
│ ├─ Rust → SeaORM (Active Record + Data Mapper)
│ └─ Go → GORM, Ent
│
├─ PERFORMANCE / QUERY CONTROL
│ └─ Query Builder (SQL-like, zero abstraction overhead)
│ ├─ Python → SQLAlchemy Core, asyncpg
│ ├─ TypeScript → Drizzle, Kysely
│ ├─ Rust → SQLx (compile-time query validation!)
│ └─ Go → sqlc (generates types from SQL)
│
├─ TYPE SAFETY / COMPILE-TIME GUARANTEES
│ ├─ Rust → SQLx (queries checked at build time)
│ ├─ Go → sqlc (generates types from SQL)
│ ├─ TypeScript → Prisma or Drizzle
│ └─ Python → SQLModel (Pydantic integration)
│
└─ COMPLEX QUERIES / JOINS
├─ SQL-first → Query builders or raw SQL
└─ ORM-friendly → SeaORM, SQLAlchemy ORMORM vs Query Builder Selection
═══════════════════════════════════════════════════════════
TEAM PRIORITIES?
├─ DEVELOPMENT SPEED / DEVELOPER EXPERIENCE
│ └─ ORM (abstracts SQL, handles relations automatically)
│ ├─ Python → SQLAlchemy 2.0, SQLModel
│ ├─ TypeScript → Prisma (migrations, type generation)
│ ├─ Rust → SeaORM (Active Record + Data Mapper)
│ └─ Go → GORM, Ent
│
├─ PERFORMANCE / QUERY CONTROL
│ └─ Query Builder (SQL-like, zero abstraction overhead)
│ ├─ Python → SQLAlchemy Core, asyncpg
│ ├─ TypeScript → Drizzle, Kysely
│ ├─ Rust → SQLx (compile-time query validation!)
│ └─ Go → sqlc (generates types from SQL)
│
├─ TYPE SAFETY / COMPILE-TIME GUARANTEES
│ ├─ Rust → SQLx (queries checked at build time)
│ ├─ Go → sqlc (generates types from SQL)
│ ├─ TypeScript → Prisma or Drizzle
│ └─ Python → SQLModel (Pydantic integration)
│
└─ COMPLEX QUERIES / JOINS
├─ SQL-first → Query builders or raw SQL
└─ ORM-friendly → SeaORM, SQLAlchemy ORM/websites/sqlalchemy_en_21from sqlmodel import SQLModel, Field, Session
class User(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
email: str = Field(unique=True, index=True)references/orms-python.md/websites/sqlalchemy_en_21from sqlmodel import SQLModel, Field, Session
class User(SQLModel, table=True):
id: int | None = Field(default=None, primary_key=True)
email: str = Field(unique=True, index=True)references/orms-python.md/prisma/prisma/drizzle-team/drizzle-orm-docsreferences/orms-typescript.md/prisma/prisma/drizzle-team/drizzle-orm-docsreferences/orms-typescript.mduse sqlx::FromRow;
#[derive(FromRow)]
struct User { id: i32, email: String, name: String }
// Compile-time checked queries (verified at build time!)
let user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE email = $1")
.bind("test@example.com").fetch_one(&pool).await?;references/orms-rust.mduse sqlx::FromRow;
#[derive(FromRow)]
struct User { id: i32, email: String, name: String }
// 编译时校验查询(构建阶段即验证!)
let user = sqlx::query_as::<_, User>("SELECT * FROM users WHERE email = $1")
.bind("test@example.com").fetch_one(&pool).await?;references/orms-rust.md-- queries.sql: SQL annotations generate type-safe Go code
-- name: CreateUser :one
INSERT INTO users (email, name) VALUES ($1, $2) RETURNING *;user, err := queries.CreateUser(ctx, db.CreateUserParams{Email: "test@example.com"})references/orms-go.md-- queries.sql: SQL注解生成类型安全的Go代码
-- name: CreateUser :one
INSERT INTO users (email, name) VALUES ($1, $2) RETURNING *;user, err := queries.CreateUser(ctx, db.CreateUserParams{Email: "test@example.com"})references/orms-go.mdreferences/connection-pooling.mdreferences/connection-pooling.mdCREATE INDEX CONCURRENTLYreferences/migrations-guide.mdCREATE INDEX CONCURRENTLYreferences/migrations-guide.md| Database | Type | Key Feature | Best For |
|---|---|---|---|
| Neon | PostgreSQL | Database branching, scale-to-zero | Development workflows, preview environments |
| PlanetScale | MySQL (Vitess) | Non-blocking schema changes | MySQL apps, zero-downtime migrations |
| Turso | SQLite (libSQL) | Edge deployment, low latency | Edge functions, global distribution |
references/serverless-databases.md| 数据库 | 类型 | 核心特性 | 适用场景 |
|---|---|---|---|
| Neon | PostgreSQL | 数据库分支、Scale-to-Zero | 开发工作流、预览环境 |
| PlanetScale | MySQL (Vitess) | 无阻塞 schema 变更 | MySQL 应用、零停机迁移 |
| Turso | SQLite (libSQL) | 边缘部署、低延迟 | 边缘函数、全球分布式部署 |
references/serverless-databases.mdexamples/python-sqlalchemy/examples/typescript-drizzle/examples/rust-sqlx/examples/python-sqlalchemy/examples/typescript-drizzle/examples/rust-sqlx/references/postgresql-guide.mdreferences/mysql-guide.mdreferences/sqlite-guide.mdreferences/orms-python.mdreferences/orms-typescript.mdreferences/orms-rust.mdreferences/orms-go.mdreferences/migrations-guide.mdreferences/connection-pooling.mdreferences/serverless-databases.mdreferences/postgresql-guide.mdreferences/mysql-guide.mdreferences/sqlite-guide.mdreferences/orms-python.mdreferences/orms-typescript.mdreferences/orms-rust.mdreferences/orms-go.mdreferences/migrations-guide.mdreferences/connection-pooling.mdreferences/serverless-databases.mdexamples/python-sqlalchemy/examples/typescript-prisma/examples/typescript-drizzle/examples/rust-sqlx/examples/go-sqlc/examples/python-sqlalchemy/examples/typescript-prisma/examples/typescript-drizzle/examples/rust-sqlx/examples/go-sqlc/scripts/validate_schema.pyscripts/generate_migration.pyscripts/validate_schema.pyscripts/generate_migration.pyEXPLAIN ANALYZEEXPLAIN ANALYZE