文档目录
商品表结构

简介

本设计文档聚焦 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
添加日期:2026-10-05