docs(constitution): 新增数据库设计原则(v2.4.0)

在项目宪章中新增第九条原则"数据库设计原则",明确禁止使用数据库外键约束和ORM关联标签。

主要变更:
- 新增原则IX:数据库设计原则(Database Design Principles)
- 强制要求:数据库表不得使用外键约束
- 强制要求:GORM模型不得使用ORM关联标签(foreignKey、hasMany等)
- 强制要求:表关系必须通过ID字段手动维护
- 强制要求:关联数据查询必须显式编写,避免ORM魔法
- 强制要求:时间字段由GORM处理,不使用数据库触发器

设计理念:
- 提升业务逻辑灵活性(无数据库约束限制)
- 优化高并发性能(无外键检查开销)
- 增强代码可读性(显式查询,无隐式预加载)
- 简化数据库架构和迁移流程
- 支持分布式和微服务场景

版本升级:2.3.0 → 2.4.0(MINOR)
This commit is contained in:
2025-11-13 13:40:19 +08:00
parent ea0c6a8b16
commit 984ccccc63
63 changed files with 12099 additions and 83 deletions

View File

@@ -17,8 +17,13 @@ import (
"github.com/break/junhong_cmp_fiber/internal/handler"
"github.com/break/junhong_cmp_fiber/internal/middleware"
"github.com/break/junhong_cmp_fiber/internal/service/order"
"github.com/break/junhong_cmp_fiber/internal/service/user"
"github.com/break/junhong_cmp_fiber/internal/store/postgres"
"github.com/break/junhong_cmp_fiber/pkg/config"
"github.com/break/junhong_cmp_fiber/pkg/database"
"github.com/break/junhong_cmp_fiber/pkg/logger"
"github.com/break/junhong_cmp_fiber/pkg/queue"
"github.com/break/junhong_cmp_fiber/pkg/validator"
)
@@ -83,9 +88,44 @@ func main() {
}
appLogger.Info("Redis 已连接", zap.String("address", redisAddr))
// 初始化 PostgreSQL 连接
db, err := database.InitPostgreSQL(&cfg.Database, appLogger)
if err != nil {
appLogger.Fatal("初始化 PostgreSQL 失败", zap.Error(err))
}
defer func() {
sqlDB, _ := db.DB()
if sqlDB != nil {
if err := sqlDB.Close(); err != nil {
appLogger.Error("关闭 PostgreSQL 连接失败", zap.Error(err))
}
}
}()
// 初始化 Asynq 任务提交客户端
queueClient := queue.NewClient(redisClient, appLogger)
defer func() {
if err := queueClient.Close(); err != nil {
appLogger.Error("关闭 Asynq 客户端失败", zap.Error(err))
}
}()
// 创建令牌验证器
tokenValidator := validator.NewTokenValidator(redisClient, appLogger)
// 初始化 Store 层
store := postgres.NewStore(db, appLogger)
// 初始化 Service 层
userService := user.NewService(store, appLogger)
orderService := order.NewService(store, appLogger)
// 初始化 Handler 层
userHandler := handler.NewUserHandler(userService, appLogger)
orderHandler := handler.NewOrderHandler(orderService, appLogger)
taskHandler := handler.NewTaskHandler(queueClient, appLogger)
healthHandler := handler.NewHealthHandler(db, redisClient, appLogger)
// 启动配置文件监听器(热重载)
watchCtx, cancelWatch := context.WithCancel(context.Background())
defer cancelWatch()
@@ -125,7 +165,7 @@ func main() {
// 路由注册
// 公共端点(无需认证)
app.Get("/health", handler.HealthCheck)
app.Get("/health", healthHandler.Check)
// API v1 路由组
v1 := app.Group("/api/v1")
@@ -160,8 +200,22 @@ func main() {
))
}
// 注册受保护的路由
v1.Get("/users", handler.GetUsers)
// 用户路由
v1.Post("/users", userHandler.CreateUser)
v1.Get("/users/:id", userHandler.GetUser)
v1.Put("/users/:id", userHandler.UpdateUser)
v1.Delete("/users/:id", userHandler.DeleteUser)
v1.Get("/users", userHandler.ListUsers)
// 订单路由
v1.Post("/orders", orderHandler.CreateOrder)
v1.Get("/orders/:id", orderHandler.GetOrder)
v1.Put("/orders/:id", orderHandler.UpdateOrder)
v1.Get("/orders", orderHandler.ListOrders)
// 任务路由
v1.Post("/tasks/email", taskHandler.SubmitEmailTask)
v1.Post("/tasks/sync", taskHandler.SubmitSyncTask)
// 优雅关闭
quit := make(chan os.Signal, 1)