Files
2026-04-01 15:29:35 +08:00

49 lines
2.2 KiB
Go

// Package models 定义知识库 .db 文件中的核心业务表。
package models
import "time"
// Entry 是知识库中的一条问答记录,存储于各知识库 .db 文件的 entries 表。
//
// # 设计说明
//
// Entry 不包含 user_id 字段——这是本架构与传统多用户方案的核心区别。
// 数据隔离通过"切换不同 .db 文件"实现(物理隔离),而非逻辑隔离。
// 这意味着:
// - 每个知识库文件就是一个完全独立的数据源;
// - 任何针对 Entry 的查询都自动限定在当前活跃的知识库内;
// - 不存在因遗漏 WHERE user_id = ? 而导致跨库数据泄露的风险。
//
// # 字段说明
//
// Keyword 是搜索的主要匹配目标(经过 INDEX 加速),
// Question 存放完整的问题文本(兼做二级匹配),
// Answer 存放答案全文(供 AI 润色时作为原始素材)。
type Entry struct {
ID uint `gorm:"primaryKey;autoIncrement" json:"id"`
// Keyword 是精简的检索关键词,例如 "退款政策"、"浇水频率"。
// 添加了 GORM 索引(B-Tree),使 LIKE '%keyword%' 查询更快。
// size:255 对应 TEXT NOT NULL,防止存入过长字符串或空值。
Keyword string `gorm:"index;size:255;not null" json:"keyword"`
// Question 是完整的问题描述,作为搜索的二级匹配字段。
// type:text 映射到 SQLite TEXT 类型,无长度限制。
Question string `gorm:"type:text;not null" json:"question"`
// Answer 是对应答案全文,也是传给 AI 做"润色"的原始素材。
Answer string `gorm:"type:text;not null" json:"answer"`
// Category 用于前端分类展示和颜色区分(例如 "浇水"、"病虫害")。
// default:'通用' 保证没填分类时有默认值,避免前端渲染空标签。
Category string `gorm:"size:100;default:'通用'" json:"category"`
// GORM 约定字段:自动维护创建时间和最后更新时间。
// UpdatedAt 用于在搜索无结果时排序返回"最近更新"的热门问答。
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
// TableName 显式指定表名为 "entries"(避免 GORM 默认复数化为 "entries" / "entris")。
func (Entry) TableName() string { return "entries" }