简介
本设计文档聚焦 DouPHP 商品管理模块的数据库表结构设计,围绕以下目标展开:
- 商品主表、商品分类表、商品属性表(dou_attribute)、商品属性值表(dou_attribute_value)的设计原理与字段说明。
- 商品字段设计涵盖基本信息、价格、库存、图片、描述等核心维度。
- 商品属性的动态扩展机制,支持多种属性类型(如 text、image),并解释属性与分类的关联方式。
- 商品分类的层级关系与属性关联关系。
- 提供完整的数据模型与查询优化策略,便于电商开发者参考与落地。
项目结构
与商品表结构直接相关的代码与脚本主要位于:
- 系统级 SQL 定义:包含 dou_product、dou_product_category、dou_attribute、dou_attribute_value 等表的创建与索引定义。
- 模块级备份 SQL:product.sql 定义了 product 与 product_category 表;item.sql 定义了 item 与 item_category 表(用于内容型“项目”)。
- 后台模型:Product、ProductCategory、Attribute 等模型封装了表名、字段白名单、排序与筛选逻辑。
graph TB
A["系统SQL<br/>系统表结构.sql"] --> B["商品主表<br/>dou_product"]
A --> C["商品分类表<br/>dou_product_category"]
A --> D["属性定义表<br/>dou_attribute"]
A --> E["属性值表<br/>dou_attribute_value"]
F["模块SQL<br/>product.sql"] --> B
F --> C
G["模块SQL<br/>item.sql"] --> H["内容项表<br/>dou_item"]
G --> I["内容项分类表<br/>dou_item_category"]
J["后台模型<br/>Product.php"] --> B
K["后台模型<br/>ProductCategory.php"] --> C
L["后台模型<br/>Attribute.php"] --> D
图表来源
- 系统表结构.sql:292-320
- system表结构.sql:1882-1914
- product.sql:6-50
- item.sql:6-47
- Product.php:33-90
- ProductCategory.php:27-70
- Attribute.php:29-43
章节来源
- 系统表结构.sql:292-320
- 系统表结构.sql:1882-1914
- product.sql:6-50
- item.sql:6-47
- Product.php:33-90
- ProductCategory.php:27-70
- Attribute.php:29-43
核心组件
- 商品主表(dou_product):承载商品的基本信息、价格、促销价、库存、图片、型号、销量、SEO 等核心字段,并通过 category_id 关联商品分类。
- 商品分类表(dou_product_category):支持树形层级(parent_id),具备 SEO 字段与导航同步开关。
- 属性定义表(dou_attribute):以 module=product 限定为商品属性,按分类(cat_id)组织,type 表示属性类型(如 text、image)。
- 属性值表(dou_attribute_value):记录具体属性值,支持文本、图片、备注与价格变动(price_change),通过 att_id 关联属性定义。
上述四张表共同构成“商品-分类-属性-属性值”的完整数据模型,支撑商品的多维度展示与交易计算。
章节来源
- 系统表结构.sql:292-320
- 系统表结构.sql:1882-1914
架构总览
下图展示了商品主表、分类表、属性表与属性值表之间的关系,以及它们在后台模型中的映射。
erDiagram
DOU_PRODUCT {
int id PK
smallint category_id FK
enum operator_type
int operator_id
mediumint brand_id
varchar title
varchar slug
decimal price
varchar level_price
decimal promote_price
datetime promote_start_at
datetime promote_end_at
smallint stock
text defined
longtext content
varchar image
varchar model
smallint point
mediumint sales
varchar keywords
text description
smallint sort
tinyint status
datetime created_at
}
DOU_PRODUCT_CATEGORY {
smallint id PK
varchar slug
varchar name
varchar icon
varchar keywords
text description
smallint parent_id FK
tinyint sync_to_nav
tinyint sort
}
DOU_ATTRIBUTE {
smallint att_id PK
varchar module
smallint cat_id
varchar name
varchar type
tinyint sort
}
DOU_ATTRIBUTE_VALUE {
mediumint id PK
varchar module
smallint item_id
smallint att_id FK
text value
varchar type
varchar image
varchar remark
decimal price_change
}
DOU_PRODUCT_CATEGORY ||--o{ DOU_PRODUCT : "category_id"
DOU_ATTRIBUTE ||--o{ DOU_ATTRIBUTE_VALUE : "att_id"
图表来源
- product.sql:6-50
- 系统表结构.sql:292-320
- 系统表结构.sql:1882-1914
详细组件分析
商品主表(dou_product)
- 基本信息:title、slug、brand_id、model、keywords、description、content、image、defined。
- 价格与促销:price、level_price(会员等级价)、promote_price、promote_start_at、promote_end_at。
- 库存与运营:stock、point(积分)、sales(销量)、sort、status、created_at。
- 归属与权限:operator_type、operator_id(区分管理员或工作台创建者)。
- 模型层:Product 模型声明了 fillable 白名单、casts 格式化、默认排序与筛选 scope,并提供删除时清理图库与多语言记录的钩子。
classDiagram
class ProductModel {
+string table = "product"
+array fillables
+array casts
+scopeFilterByKeyword(keyword)
+scopeApplyDefaultOrder()
+scopePublished()
+scopeOwnedByWork(workId)
+getGalleryFileNumberRows(productId)
+ensureOrCreateModelNumber(id)
}
图表来源
- Product.php:33-90
- Product.php:109-159
- Product.php:196-297
章节来源
- product.sql:6-35
- Product.php:33-90
- Product.php:109-159
- Product.php:196-297
商品分类表(dou_product_category)
- 层级关系:parent_id 实现树形分类,支持多级分类。
- SEO 与展示:name、icon、keywords、description、sync_to_nav(是否同步至导航)、sort。
- 模型层:ProductCategory 模型使用 HasCategoryTree 特性,recordsTable 指向 product,便于统计与联动操作。
flowchart TD
Start(["分类树构建"]) --> Root["根分类(parent_id=0)"]
Root --> Level1["一级分类"]
Level1 --> Level2["二级分类"]
Level2 --> Level3["三级分类"]
Level3 --> End(["形成分类树"])
图表来源
- product.sql:38-50
- ProductCategory.php:27-70
章节来源
- product.sql:38-50
- ProductCategory.php:27-70
商品属性表(dou_attribute)与属性值表(dou_attribute_value)
- 属性定义(dou_attribute):
- module=product 限定为商品属性。
- cat_id 指定所属分类,支持全局属性(cat_id=0)与子分类继承。
- type 表示属性类型(如 text、image),用于前端渲染与校验。
- sort 控制显示顺序。
- 属性值(dou_attribute_value):
- item_id 通常对应商品 ID,将属性值绑定到具体商品。
- value 存储属性值内容,type 与 image 配合处理不同类型(文本/图片)。
- remark 附加说明,price_change 支持基于属性值的加价或折扣。
- 模型层:Attribute 模型提供按商品分类筛选(含子分类与全局属性)的 scope,默认排序与存在性检查。
sequenceDiagram
participant Admin as "后台界面"
participant Model as "Attribute 模型"
participant DB as "数据库"
Admin->>Model : 获取属性列表(cat_id)
Model->>DB : 查询 attribute (module=product, cat_id IN 子树+0)
DB-->>Model : 返回属性定义
Model-->>Admin : 渲染属性表单
Admin->>DB : 提交属性值(value,type,image,remark,price_change)
DB-->>Admin : 保存成功
图表来源
- 系统表结构.sql:292-320
- Attribute.php:45-65
- Attribute.php:73-85
章节来源
- 系统表结构.sql:292-320
- Attribute.php:45-65
- Attribute.php:73-85
商品字段设计详解
- 基本信息:title、slug、brand_id、model、keywords、description、content、image、defined。
- 价格与促销:price、level_price、promote_price、promote_start_at、promote_end_at。
- 库存与运营:stock、point、sales、sort、status、created_at。
- 归属与权限:operator_type、operator_id。
- 这些字段在 Product 模型的 fillable 中明确声明,确保批量写入安全可控。
章节来源
- product.sql:6-35
- Product.php:61-90
商品分类的层级关系与属性关联
- 分类层级:通过 parent_id 实现树形结构,支持多级分类。
- 属性关联:属性定义通过 cat_id 关联分类,支持全局属性(cat_id=0)与子分类继承;属性值通过 att_id 关联属性定义,并通过 item_id 绑定到具体商品。
- 模型层:Attribute 模型提供按商品分类筛选的 scope,自动合并子分类与全局属性。
章节来源
- product.sql:38-50
- 系统表结构.sql:292-320
- Attribute.php:45-65
依赖关系分析
- 商品主表依赖商品分类表(category_id)。
- 属性值表依赖属性定义表(att_id)。
- 属性定义表通过 cat_id 与商品分类表间接关联(支持全局与子分类)。
- 模型层通过 fillable、casts、scopes 等机制约束与增强数据访问。
graph LR
P["dou_product"] --> PC["dou_product_category"]
AV["dou_attribute_value"] --> A["dou_attribute"]
A --> PC
图表来源
- product.sql:6-50
- 系统表结构.sql:292-320
章节来源
- product.sql:6-50
- 系统表结构.sql:292-320
性能考虑
- 索引建议:
- dou_product:对 slug、operator_type+operator_id、category_id、status、sort 建立合适索引,提升列表与详情查询效率。
- dou_product_category:对 parent_id、sort 建立索引,加速分类树构建与排序。
- dou_attribute:对 module、cat_id、sort 建立索引,提升属性列表查询。
- dou_attribute_value:对 module、item_id、att_id、type 建立索引,提升属性值检索与聚合。
- 查询优化:
- 使用 scope 过滤与默认排序,减少不必要的全表扫描。
- 列表页按需加载附件 URL(prefetchers),避免多次远程请求。
- 对大字段(content、description)进行分页或懒加载。
- 事务与一致性:
- 商品与属性值更新建议使用事务,保证数据一致性。
- 删除商品时清理图库与多语言记录,避免孤儿数据。
故障排查指南
- 常见问题:
- 属性值未生效:检查 att_id 是否正确,type 与 value 是否匹配。
- 分类树异常:确认 parent_id 设置正确,无循环引用。
- 商品列表为空:检查 status、sort、operator_type/operator_id 权限边界。
- 调试方法:
- 使用模型 scope 逐步缩小查询范围。
- 查看属性值是否存在于 attribute_value 表,并与 attribute 表关联。
- 检查删除流程是否清理了图库与多语言记录。
章节来源
- Product.php:109-159
- Product.php:275-297
- Attribute.php:73-85
结论
DouPHP 商品管理模块通过 dou_product、dou_product_category、dou_attribute、dou_attribute_value 四张核心表,构建了灵活且可扩展的商品数据模型。商品主表承载业务核心字段,分类表支持树形结构,属性表与属性值表实现动态扩展。结合后台模型的白名单、排序与筛选能力,系统在易用性与性能之间取得平衡。建议在生产环境中根据实际数据量与查询模式完善索引与缓存策略,以提升整体性能与稳定性。
附录
- 相关模块对比:item 模块(内容项)与 product 模块(商品)在表结构与模型上具有相似性,可参考 item.sql 与 Item 模型了解通用设计模式。
- 扩展建议:
- 为商品增加更多营销字段(如标签、活动标识)。
- 为属性值增加更多类型(如数字、下拉选项)。
- 引入版本化与审计字段,便于追踪变更历史。
章节来源
- item.sql:6-47
- Item.php:31-85