@hhlf282
2026-03-20T01:02:33.000000Z
字数 12450
阅读 17
目标: 设计 Daraz 选品系统的数据库架构
版本: 1.0
创建时间: 2026-03-19
┌─────────────┐ ┌─────────────┐ ┌─────────────┐│ categories │ │ products │ │ sellers │├─────────────┤ ├─────────────┤ ├─────────────┤│ id │◄──────│ category_id │ │ id ││ name │ │ title │──────►│ seller_id ││ parent_id │ │ price │ │ name ││ level │ │ ... │ │ rating │└─────────────┘ └──────┬──────┘ └─────────────┘│┌──────────────┼──────────────┐│ │ │▼ ▼ ▼┌─────────────┐ ┌─────────────┐ ┌─────────────┐│price_history│ │sales_history│ │ reviews │├─────────────┤ ├─────────────┤ ├─────────────┤│ item_id │ │ item_id │ │ item_id ││ price │ │ sold_count │ │ rating ││ crawl_time │ │ crawl_time │ │ comment │└─────────────┘ └─────────────┘ └─────────────┘
-- 类目表CREATE TABLE categories (id VARCHAR(50) PRIMARY KEY,name VARCHAR(200) NOT NULL,parent_id VARCHAR(50),level INTEGER NOT NULL DEFAULT 1,path VARCHAR(500), -- 类目路径,如 "1/10/100"is_active BOOLEAN DEFAULT TRUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (parent_id) REFERENCES categories(id));-- 商品表CREATE TABLE products (id SERIAL PRIMARY KEY,item_id VARCHAR(50) UNIQUE NOT NULL,title VARCHAR(500) NOT NULL,price DECIMAL(10,2) NOT NULL,original_price DECIMAL(10,2),discount_rate DECIMAL(5,2),currency VARCHAR(3) DEFAULT 'LKR',-- 类目信息category_id VARCHAR(50) NOT NULL,category_name VARCHAR(200),-- 品牌信息brand VARCHAR(200),-- 卖家信息seller_id VARCHAR(50),seller_name VARCHAR(200),-- 评价信息rating DECIMAL(3,2) CHECK (rating >= 0 AND rating <= 5),review_count INTEGER DEFAULT 0,sold_count INTEGER DEFAULT 0,-- 商品信息stock_status VARCHAR(50),images JSONB,description TEXT,specifications JSONB,-- 物流信息shipping_fee DECIMAL(10,2),delivery_time VARCHAR(100),return_policy TEXT,-- 爬取信息source_url VARCHAR(500),crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,-- 系统字段created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (category_id) REFERENCES categories(id),FOREIGN KEY (seller_id) REFERENCES sellers(seller_id));-- 卖家表CREATE TABLE sellers (id SERIAL PRIMARY KEY,seller_id VARCHAR(50) UNIQUE NOT NULL,name VARCHAR(200) NOT NULL,rating DECIMAL(3,2),follower_count INTEGER DEFAULT 0,product_count INTEGER DEFAULT 0,response_rate DECIMAL(5,2),ship_on_time_rate DECIMAL(5,2),chat_response_time VARCHAR(50),is_verified BOOLEAN DEFAULT FALSE,is_mall BOOLEAN DEFAULT FALSE,location VARCHAR(200),established_date DATE,crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
-- 价格历史表CREATE TABLE price_history (id SERIAL PRIMARY KEY,item_id VARCHAR(50) NOT NULL,price DECIMAL(10,2) NOT NULL,original_price DECIMAL(10,2),discount_rate DECIMAL(5,2),currency VARCHAR(3) DEFAULT 'LKR',crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (item_id) REFERENCES products(item_id));-- 销量历史表CREATE TABLE sales_history (id SERIAL PRIMARY KEY,item_id VARCHAR(50) NOT NULL,sold_count INTEGER NOT NULL,crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (item_id) REFERENCES products(item_id));-- 评论表CREATE TABLE reviews (id SERIAL PRIMARY KEY,item_id VARCHAR(50) NOT NULL,review_id VARCHAR(50) UNIQUE,user_name VARCHAR(200),user_avatar VARCHAR(500),rating INTEGER CHECK (rating >= 1 AND rating <= 5),comment TEXT,images JSONB,helpful_count INTEGER DEFAULT 0,is_verified_purchase BOOLEAN DEFAULT FALSE,crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (item_id) REFERENCES products(item_id));-- 创建索引CREATE INDEX idx_price_history_item ON price_history(item_id);CREATE INDEX idx_price_history_time ON price_history(crawl_time);CREATE INDEX idx_sales_history_item ON sales_history(item_id);CREATE INDEX idx_sales_history_time ON sales_history(crawl_time);CREATE INDEX idx_reviews_item ON reviews(item_id);CREATE INDEX idx_reviews_rating ON reviews(rating);
-- 供应商表CREATE TABLE suppliers (id SERIAL PRIMARY KEY,supplier_id VARCHAR(50) UNIQUE NOT NULL,name VARCHAR(200) NOT NULL,source_platform VARCHAR(50) DEFAULT '1688',source_url VARCHAR(500),rating DECIMAL(3,2),years_in_business INTEGER,response_rate DECIMAL(5,2),repeat_purchase_rate DECIMAL(5,2),is_verified BOOLEAN DEFAULT FALSE,is_manufacturer BOOLEAN DEFAULT FALSE,location VARCHAR(200),main_categories JSONB,crawl_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP);-- 商品 - 供应商关联表CREATE TABLE product_sources (id SERIAL PRIMARY KEY,product_id INTEGER NOT NULL,supplier_id VARCHAR(50) NOT NULL,source_url VARCHAR(500) NOT NULL,-- 价格信息source_price DECIMAL(10,2) NOT NULL, -- 采购价 (RMB)currency VARCHAR(3) DEFAULT 'CNY',-- 起订量moq INTEGER DEFAULT 1,-- 物流信息shipping_cost DECIMAL(10,2),lead_time INTEGER, -- 供货周期 (天)shipping_from VARCHAR(200),-- 匹配信息match_score DECIMAL(5,2), -- 匹配度评分match_method VARCHAR(50), -- 匹配方式 (manual/auto)-- 系统字段is_active BOOLEAN DEFAULT TRUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (product_id) REFERENCES products(id),FOREIGN KEY (supplier_id) REFERENCES suppliers(supplier_id),UNIQUE (product_id, supplier_id, source_url));
-- 选品评估表CREATE TABLE product_evaluations (id SERIAL PRIMARY KEY,item_id VARCHAR(50) NOT NULL,-- 评估时间evaluation_date DATE NOT NULL DEFAULT CURRENT_DATE,-- 各维度评分market_demand_score DECIMAL(3,2), -- 市场需求 (0-10)profitability_score DECIMAL(3,2), -- 利润空间 (0-10)competition_score DECIMAL(3,2), -- 竞争程度 (0-10)supply_chain_score DECIMAL(3,2), -- 供应链 (0-10)risk_score DECIMAL(3,2), -- 风险 (0-10)-- 综合评分total_score DECIMAL(5,2),recommendation VARCHAR(50), -- 强烈推荐/推荐/谨慎/不推荐-- 预测数据predicted_monthly_sales INTEGER,predicted_gross_margin DECIMAL(5,2),predicted_roi DECIMAL(5,2),-- 风险评估risk_level VARCHAR(50), -- low/medium/highrisk_factors JSONB,-- 运营建议suggestions JSONB,-- 评估来源evaluated_by VARCHAR(50), -- ai/manualmodel_version VARCHAR(50),-- 后续跟踪actual_monthly_sales INTEGER, -- 实际月销量 (后续填充)actual_gross_margin DECIMAL(5,2), -- 实际毛利率 (后续填充)is_success BOOLEAN, -- 是否成功 (后续填充)success_date DATE, -- 成功/失败确认日期created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (item_id) REFERENCES products(item_id));-- 选品决策表CREATE TABLE product_decisions (id SERIAL PRIMARY KEY,evaluation_id INTEGER NOT NULL,-- 决策信息decision VARCHAR(50) NOT NULL, -- approve/reject/pendingdecision_date DATE NOT NULL,decided_by VARCHAR(100) NOT NULL, -- 决策人-- 采购计划planned_quantity INTEGER,planned_budget DECIMAL(12,2),expected_launch_date DATE,-- 实际执行actual_quantity INTEGER,actual_cost DECIMAL(12,2),actual_launch_date DATE,-- 备注notes TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (evaluation_id) REFERENCES product_evaluations(id));-- 创建索引CREATE INDEX idx_evaluations_item ON product_evaluations(item_id);CREATE INDEX idx_evaluations_date ON product_evaluations(evaluation_date);CREATE INDEX idx_evaluations_score ON product_evaluations(total_score);CREATE INDEX idx_decisions_evaluation ON product_decisions(evaluation_id);CREATE INDEX idx_decisions_date ON product_decisions(decision_date);
-- 销售订单表CREATE TABLE sales_orders (id SERIAL PRIMARY KEY,order_id VARCHAR(100) UNIQUE NOT NULL,item_id VARCHAR(50) NOT NULL,-- 订单信息order_date TIMESTAMP NOT NULL,quantity INTEGER NOT NULL,unit_price DECIMAL(10,2) NOT NULL,total_amount DECIMAL(10,2) NOT NULL,-- 成本信息source_cost DECIMAL(10,2),shipping_cost DECIMAL(10,2),commission DECIMAL(10,2),gross_profit DECIMAL(10,2),-- 订单状态status VARCHAR(50),payment_method VARCHAR(50),-- 客户信息customer_id VARCHAR(100),customer_location VARCHAR(200),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (item_id) REFERENCES products(item_id));-- 库存表CREATE TABLE inventory (id SERIAL PRIMARY KEY,item_id VARCHAR(50) NOT NULL,-- 库存信息quantity_on_hand INTEGER NOT NULL,quantity_available INTEGER NOT NULL,quantity_reserved INTEGER DEFAULT 0,-- 仓库信息warehouse_id VARCHAR(50),warehouse_location VARCHAR(200),-- 成本信息unit_cost DECIMAL(10,2),total_value DECIMAL(12,2),-- 预警reorder_point INTEGER,is_low_stock BOOLEAN DEFAULT FALSE,-- 时间信息last_restock_date DATE,last_sale_date DATE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,FOREIGN KEY (item_id) REFERENCES products(item_id));-- 创建索引CREATE INDEX idx_orders_item ON sales_orders(item_id);CREATE INDEX idx_orders_date ON sales_orders(order_date);CREATE INDEX idx_inventory_item ON inventory(item_id);
-- 商品综合视图CREATE VIEW v_product_summary ASSELECTp.item_id,p.title,p.price,p.category_name,p.seller_name,p.rating,p.sold_count,p.review_count,-- 价格趋势ph.current_price,ph.min_price_30d,ph.max_price_30d,ph.avg_price_30d,-- 销量趋势sh.current_sales,sh.avg_sales_30d,sh.sales_growth_30d,-- 供应链信息ps.source_price,ps.shipping_cost,ps.lead_time,ps.supplier_name,-- 利润测算(p.price - ps.source_price * 60 - ps.shipping_cost) / p.price as gross_margin,-- 评估信息pe.total_score,pe.recommendation,pe.risk_levelFROM products pLEFT JOIN (SELECTitem_id,price as current_price,MIN(price) as min_price_30d,MAX(price) as max_price_30d,AVG(price) as avg_price_30dFROM price_historyWHERE crawl_time > NOW() - INTERVAL '30 days'GROUP BY item_id) ph ON p.item_id = ph.item_idLEFT JOIN (SELECTitem_id,sold_count as current_sales,AVG(sold_count) as avg_sales_30d,(sold_count - LAG(sold_count) OVER (PARTITION BY item_id ORDER BY crawl_time)) /NULLIF(LAG(sold_count) OVER (PARTITION BY item_id ORDER BY crawl_time), 0) as sales_growth_30dFROM sales_historyWHERE crawl_time > NOW() - INTERVAL '30 days') sh ON p.item_id = sh.item_idLEFT JOIN (SELECT DISTINCT ON (item_id)item_id,source_price,shipping_cost,lead_time,s.name as supplier_nameFROM product_sources psJOIN suppliers s ON ps.supplier_id = s.supplier_idWHERE ps.is_active = TRUEORDER BY item_id, ps.match_score DESC) ps ON p.item_id = ps.item_idLEFT JOIN (SELECT DISTINCT ON (item_id)item_id,total_score,recommendation,risk_levelFROM product_evaluationsORDER BY item_id, evaluation_date DESC) pe ON p.item_id = pe.item_id;-- 类目统计视图CREATE VIEW v_category_stats ASSELECTc.id as category_id,c.name as category_name,c.parent_id,c.level,-- 商品统计COUNT(DISTINCT p.item_id) as product_count,COUNT(DISTINCT p.seller_id) as seller_count,-- 价格统计AVG(p.price) as avg_price,MIN(p.price) as min_price,MAX(p.price) as max_price,STDDEV(p.price) as price_variance,-- 销量统计AVG(p.sold_count) as avg_sales,SUM(p.sold_count) as total_sales,-- 评分统计AVG(p.rating) as avg_rating,AVG(p.review_count) as avg_reviews,-- 头部集中度(SELECT SUM(sold_count) FROM products p2WHERE p2.category_id = c.idORDER BY sold_count DESC LIMIT 3) /NULLIF(SUM(p.sold_count), 0) as top3_concentration,updated_at as last_updatedFROM categories cLEFT JOIN products p ON c.id = p.category_id AND p.crawl_time > NOW() - INTERVAL '7 days'WHERE c.is_active = TRUEGROUP BY c.id, c.name, c.parent_id, c.level;
| 表名 | 字段名 | 类型 | 说明 | 示例 |
|---|---|---|---|---|
| products | item_id | VARCHAR(50) | 商品唯一 ID | "123456789" |
| products | price | DECIMAL(10,2) | 售价 (LKR) | 2500.00 |
| products | sold_count | INTEGER | 销量 | 150 |
| products | rating | DECIMAL(3,2) | 评分 (0-5) | 4.5 |
| product_evaluations | total_score | DECIMAL(5,2) | 综合评分 (0-100) | 85.5 |
| product_evaluations | recommendation | VARCHAR(50) | 推荐等级 | "强烈推荐" |
| sales_orders | gross_profit | DECIMAL(10,2) | 毛利润 (LKR) | 875.00 |
-- 推荐等级recommendation IN ('强烈推荐', '推荐', '谨慎考虑', '不推荐')-- 风险等级risk_level IN ('low', 'medium', 'high')-- 决策状态decision IN ('approve', 'reject', 'pending')-- 订单状态status IN ('pending', 'paid', 'shipped', 'delivered', 'cancelled', 'refunded')-- 库存状态stock_status IN ('in_stock', 'low_stock', 'out_of_stock', 'pre_order')
-- 1. 创建数据库CREATE DATABASE daraz_product_selectionWITH ENCODING = 'UTF8'LC_COLLATE = 'en_US.UTF-8'LC_CTYPE = 'en_US.UTF-8';-- 2. 创建用户CREATE USER daraz_user WITH PASSWORD 'your_secure_password';GRANT ALL PRIVILEGES ON DATABASE daraz_product_selection TO daraz_user;-- 3. 创建扩展CREATE EXTENSION IF NOT EXISTS "uuid-ossp";CREATE EXTENSION IF NOT EXISTS "pg_stat_statements";-- 4. 执行建表脚本-- (执行上述所有 CREATE TABLE 语句)-- 5. 授予权限GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO daraz_user;GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO daraz_user;
#!/bin/bash# backup.sh - 每日备份脚本DATE=$(date +%Y%m%d)BACKUP_DIR="/backups/daraz"DB_NAME="daraz_product_selection"DB_USER="daraz_user"# 创建备份目录mkdir -p $BACKUP_DIR# 备份数据库pg_dump -U $DB_USER -h localhost $DB_NAME | gzip > $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz# 删除 30 天前的备份find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete# 上传到云存储 (可选)# aws s3 cp $BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz s3://your-bucket/backups/echo "Backup completed: ${DB_NAME}_${DATE}.sql.gz"
-- 高频查询字段建立索引CREATE INDEX idx_products_category_price ON products(category_id, price);CREATE INDEX idx_products_sales_rating ON products(sold_count DESC, rating DESC);CREATE INDEX idx_products_crawl_time ON products(crawl_time);-- 组合索引 (根据实际查询)CREATE INDEX idx_evaluations_score_date ON product_evaluations(total_score DESC, evaluation_date DESC);-- 部分索引 (只索引活跃数据)CREATE INDEX idx_products_active ON products(item_id) WHERE stock_status = 'in_stock';-- 分析索引使用情况SELECT schemaname, tablename, indexname, idx_scan, idx_tup_read, idx_tup_fetchFROM pg_stat_user_indexesORDER BY idx_scan DESC;
-- 价格历史表按月分区CREATE TABLE price_history_2026_01 PARTITION OF price_historyFOR VALUES FROM ('2026-01-01') TO ('2026-02-01');CREATE TABLE price_history_2026_02 PARTITION OF price_historyFOR VALUES FROM ('2026-02-01') TO ('2026-03-01');-- 销售订单表按月分区CREATE TABLE sales_orders_2026_01 PARTITION OF sales_ordersFOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
版本: 1.0
创建时间: 2026-03-19
维护者: 技术团队