148 lines
4.8 KiB
Markdown
148 lines
4.8 KiB
Markdown
# 02 关系与 ER(文字版)
|
||
|
||
本节用“文字版 ER + 基数(1:1 / 1:N)”描述核心表关系,并提示哪些约束来自数据库(唯一约束/外键/触发器)。
|
||
|
||
---
|
||
|
||
## 1. 统一用户体系(复用 `ak_users`)
|
||
|
||
- `ak_users` 作为统一用户主表,商城域表通过 `user_id/merchant_id` 外键关联。
|
||
|
||
> 重要前提:RLS 策略通过 `auth.uid()` 映射 `ak_users.auth_id`(详见 `05_rls_permissions_matrix.md`)。因此 `ak_users` 必须具备 `auth_id` 字段并保持唯一性(建议 `unique index`)。
|
||
|
||
---
|
||
|
||
## 2. 用户域
|
||
|
||
### 2.1 `ak_users` 1:1 `ml_user_profiles`
|
||
|
||
- **关系**:一用户一商城档案
|
||
- **依据**:`ml_user_profiles.user_id UNIQUE NOT NULL REFERENCES ak_users(id)`
|
||
|
||
### 2.2 `ak_users` 1:N `ml_user_addresses`
|
||
|
||
- **关系**:一个用户多个地址
|
||
- **默认地址约束**:同一用户最多一个 `is_default = true`
|
||
- **依据**:触发器 `ensure_single_default_address()`(数据库层自动维护)
|
||
|
||
---
|
||
|
||
## 3. 店铺/商家域
|
||
|
||
### 3.1 `ak_users(merchant)` 1:1 `ml_shops`
|
||
|
||
- **关系**:一个商家一个店铺(当前模型)
|
||
- **依据**:`ml_shops.merchant_id UNIQUE NOT NULL REFERENCES ak_users(id)`
|
||
|
||
> 影响:订单主表可直接记录 `merchant_id`,无需子订单拆分即可查询店铺信息。
|
||
|
||
---
|
||
|
||
## 4. 商品域
|
||
|
||
### 4.1 `ml_categories` 1:N `ml_categories`(自关联分类树)
|
||
|
||
- **关系**:父分类包含多个子分类
|
||
- **依据**:`ml_categories.parent_id REFERENCES ml_categories(id)`
|
||
|
||
### 4.2 `ml_categories` 1:N `ml_products`
|
||
|
||
- **关系**:一个分类包含多个商品
|
||
- **依据**:`ml_products.category_id NOT NULL REFERENCES ml_categories(id)`
|
||
|
||
### 4.3 `ml_brands` 1:N `ml_products`
|
||
|
||
- **关系**:一个品牌对应多个商品
|
||
- **依据**:`ml_products.brand_id REFERENCES ml_brands(id)`(可空)
|
||
|
||
### 4.4 `ml_products` 1:N `ml_product_skus`
|
||
|
||
- **关系**:一个商品(SPU)有多个 SKU
|
||
- **依据**:`ml_product_skus.product_id NOT NULL REFERENCES ml_products(id) ON DELETE CASCADE`
|
||
|
||
### 4.5 `ml_products` 1:N `ml_product_specs`
|
||
|
||
- **关系**:一个商品定义多个规格项
|
||
- **依据**:`ml_product_specs.product_id NOT NULL REFERENCES ml_products(id) ON DELETE CASCADE`
|
||
|
||
### 4.6 库存汇总(触发器关系)
|
||
|
||
- **事件**:`ml_product_skus` INSERT/UPDATE/DELETE
|
||
- **结果**:触发器 `update_product_stock()` 汇总更新 `ml_products.total_stock/available_stock`
|
||
|
||
---
|
||
|
||
## 5. 交易域
|
||
|
||
### 5.1 `ak_users(customer)` 1:N `ml_orders`
|
||
|
||
- **关系**:用户有多个订单
|
||
- **依据**:`ml_orders.user_id NOT NULL REFERENCES ak_users(id)`
|
||
|
||
### 5.2 `ak_users(merchant)` 1:N `ml_orders`
|
||
|
||
- **关系**:商家有多个订单
|
||
- **依据**:`ml_orders.merchant_id NOT NULL REFERENCES ak_users(id)`
|
||
|
||
> 当前订单模型为“单商家订单”(`ml_orders` 直接记录 `merchant_id`)。若要支持“一单多商家”,通常需要主/子订单拆分。
|
||
|
||
### 5.3 `ml_orders` 1:N `ml_order_items`
|
||
|
||
- **关系**:订单包含多个明细
|
||
- **依据**:`ml_order_items.order_id NOT NULL REFERENCES ml_orders(id) ON DELETE CASCADE`
|
||
|
||
### 5.4 `ml_orders` 1:1 `ml_delivery_tasks`(当前)
|
||
|
||
- **关系**:一个订单最多一个配送任务
|
||
- **依据**:`ml_delivery_tasks.order_id UNIQUE NOT NULL REFERENCES ml_orders(id)`
|
||
|
||
---
|
||
|
||
## 6. 营销域
|
||
|
||
### 6.1 `ml_coupon_templates` 1:N `ml_user_coupons`
|
||
|
||
- **关系**:一个模板可被多个用户领取
|
||
- **依据**:`ml_user_coupons.template_id NOT NULL REFERENCES ml_coupon_templates(id)`
|
||
|
||
### 6.2 `ml_user_coupons` N:1 `ml_orders`(可选关联)
|
||
|
||
- **关系**:券在使用时关联订单
|
||
- **依据**:`ml_user_coupons.order_id REFERENCES ml_orders(id)`(可空)
|
||
|
||
---
|
||
|
||
## 7. 评价域
|
||
|
||
### 7.1 `ml_orders` 1:N `ml_product_reviews`(概念上)
|
||
|
||
- **关系**:订单可产生多个评价(通常按明细评价)
|
||
- **依据**:`ml_product_reviews.order_id NOT NULL REFERENCES ml_orders(id)`
|
||
|
||
### 7.2 `ml_order_items` 1:1/N `ml_product_reviews`
|
||
|
||
- **关系**:明细可对应评价(实现上可以 1:1,也可以允许追评,取决于业务约束)
|
||
- **依据**:`ml_product_reviews.order_item_id NOT NULL REFERENCES ml_order_items(id)`
|
||
|
||
---
|
||
|
||
## 8. 行为域
|
||
|
||
- `ak_users` 1:N `ml_user_favorites`
|
||
- `ak_users` 1:N `ml_browse_history`
|
||
- `ak_users` 0..N `ml_search_history`(可匿名搜索时 user_id 为空)
|
||
|
||
---
|
||
|
||
## 9. 订阅域
|
||
|
||
### 9.1 `ml_subscription_plans` 1:N `ml_user_subscriptions`
|
||
|
||
- **关系**:一个套餐对应多个用户订阅实例
|
||
- **依据**:`ml_user_subscriptions.plan_id REFERENCES ml_subscription_plans(id)`
|
||
|
||
### 9.2 `ak_users` 1:N `ml_user_subscriptions`
|
||
|
||
- **关系**:一个用户可有多个订阅记录(例如历史续费、升级降级)
|
||
- **依据**:`ml_user_subscriptions.user_id`(当前脚本未声明外键到 `ak_users`,建议在项目侧补齐或在应用层保证一致性)
|