4. 数据库环境配置:关系型数据库与 NoSQL 数据库
在智能寻源算法中,数据库承担着品类策略元数据、供应商画像、历史寻源记录以及实时缓存数据的存储与查询任务。本章节将详细阐述关系型数据库(PostgreSQL / MySQL)与 NoSQL 数据库(Redis / MongoDB)的安装初始化、连接池配置及 ORM 集成方案,确保算法环境具备高可用、低延迟的数据访问能力。
4.1 关系型数据库安装与初始化
关系型数据库用于存储结构化数据,如品类树、供应商资质、价格区间等。推荐使用 PostgreSQL 15+ 或 MySQL 8.0+,两者均支持 JSON 字段与事务隔离,适合寻源算法的复杂查询。
4.1.1 PostgreSQL 安装与初始化
安装步骤(Ubuntu 22.04 示例):
# 更新包索引并安装 PostgreSQL
sudo apt update
sudo apt install postgresql postgresql-contrib -y
# 启动服务并设置开机自启
sudo systemctl start postgresql
sudo systemctl enable postgresql
# 切换到 postgres 用户,创建寻源数据库与专用用户
sudo -u postgres psql -c "CREATE USER sourcing_user WITH PASSWORD 'Sourcing@2025';"
sudo -u postgres psql -c "CREATE DATABASE sourcing_db OWNER sourcing_user;"
sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE sourcing_db TO sourcing_user;"
4.1.2 MySQL 安装与初始化
安装步骤(Ubuntu 22.04 示例):
# 安装 MySQL 8.0
sudo apt update
sudo apt install mysql-server -y
# 安全配置(设置 root 密码、移除匿名用户等)
sudo mysql_secure_installation
# 登录 MySQL 并创建数据库与用户
sudo mysql -u root -p
CREATE DATABASE sourcing_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'sourcing_user'@'%' IDENTIFIED BY 'Sourcing@2025';
GRANT ALL PRIVILEGES ON sourcing_db.* TO 'sourcing_user'@'%';
FLUSH PRIVILEGES;
EXIT;
4.1.3 关系型数据库对比
| 特性 | PostgreSQL | MySQL |
|---|---|---|
| JSON 支持 | 原生 JSONB,支持索引与 GIN 加速 | JSON 类型,支持索引但功能较弱 |
| 全文检索 | 内置 tsvector/tsquery,性能优秀 | 需 InnoDB 全文索引,中文需插件 |
| 并发控制 | MVCC,支持可序列化快照隔离 | MVCC,默认可重复读 |
| GIS 扩展 | PostGIS 成熟生态 | MySQL Spatial 扩展有限 |
| 推荐场景 | 复杂查询、地理空间、JSON 分析 | 高并发读、简单事务、生态兼容 |
选型建议: 若寻源算法涉及品类地理分布(如供应商区域聚类),优先选择 PostgreSQL + PostGIS;若主要处理高并发品类查询且团队熟悉 MySQL,则选择 MySQL 8.0。
4.2 NoSQL 数据库配置
NoSQL 数据库在智能寻源中承担缓存加速与文档存储角色:Redis 用于品类策略缓存、实时竞价状态;MongoDB 用于存储非结构化的供应商文档、寻源日志与品类策略快照。
4.2.1 Redis 配置
安装与基础配置(Ubuntu 22.04):
# 安装 Redis 7.x
sudo apt update
sudo apt install redis-server -y
# 编辑配置文件 /etc/redis/redis.conf
# 关键参数调整:
# bind 127.0.0.1 -::1 # 仅本地访问,生产环境需绑定内网 IP
# requirepass Redis@2025 # 设置访问密码
# maxmemory 2gb # 限制最大内存
# maxmemory-policy allkeys-lru # 淘汰策略
# 重启服务
sudo systemctl restart redis-server
sudo systemctl enable redis-server
# 验证连接
redis-cli -a Redis@2025 ping
# 返回 PONG 表示成功
4.2.2 MongoDB 配置
安装与初始化(Ubuntu 22.04):
# 导入 MongoDB 7.0 官方 GPG 密钥并添加源
wget -qO - https://www.mongodb.org/static/pgp/server-7.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
sudo apt update
sudo apt install mongodb-org -y
# 启动 MongoDB
sudo systemctl start mongod
sudo systemctl enable mongod
# 创建管理员用户与寻源数据库
mongosh
use admin
db.createUser({ user: "admin", pwd: "Admin@2025", roles: ["root"] })
use sourcing_db
db.createUser({ user: "sourcing_user", pwd: "Sourcing@2025", roles: ["readWrite"] })
exit
4.2.3 NoSQL 数据库对比
| 特性 | Redis | MongoDB |
|---|---|---|
| 数据模型 | Key-Value,支持 List/Set/Sorted Set/Hash | 文档型(BSON),支持嵌套与数组 |
| 持久化 | RDB 快照 + AOF 日志 | WiredTiger 存储引擎,支持副本集 |
| 查询能力 | 基于 Key,支持简单模式匹配 | 丰富查询、聚合管道、地理空间 |
| 典型用途 | 品类策略缓存、分布式锁、实时计数器 | 供应商文档、寻源日志、策略快照 |
| 高可用 | Redis Sentinel / Cluster | 副本集 + 分片集群 |
4.3 数据库连接池与 ORM 配置
连接池管理数据库连接的复用与生命周期,避免频繁创建/销毁连接带来的性能开销。ORM(对象关系映射)将数据库表映射为编程语言对象,提升开发效率。以下以 Python 生态为例,展示连接池与 ORM 的典型配置。
4.3.1 连接池配置
PostgreSQL 连接池(psycopg2 + SQLAlchemy):
from sqlalchemy import create_engine
# PostgreSQL 连接池配置
DATABASE_URL = "postgresql://sourcing_user:Sourcing@2025@localhost:5432/sourcing_db"
engine = create_engine(
DATABASE_URL,
pool_size=10, # 连接池大小
max_overflow=20, # 最大溢出连接数
pool_pre_ping=True, # 连接前检查有效性
pool_recycle=3600 # 连接回收时间(秒)
)
Redis 连接池(redis-py):
import redis
# Redis 连接池配置
pool = redis.ConnectionPool(
host='localhost',
port=6379,
password='Redis@2025',
db=0,
max_connections=50, # 最大连接数
socket_timeout=5, # 套接字超时(秒)
socket_connect_timeout=3
)
r = redis.Redis(connection_pool=pool)
4.3.2 ORM 配置
SQLAlchemy ORM 模型示例(品类表):
from sqlalchemy import Column, Integer, String, Float, DateTime
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime
Base = declarative_base()
class Category(Base):
__tablename__ = 'categories'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(100), nullable=False, index=True)
parent_id = Column(Integer, nullable=True)
level = Column(Integer, default=1)
strategy_type = Column(String(50), default='standard')
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
def __repr__(self):
return f"<Category(id={self.id}, name='{self.name}', level={self.level})>"
MongoEngine ORM 模型示例(供应商文档):
from mongoengine import Document, StringField, ListField, FloatField, DateTimeField
from datetime import datetime
class Supplier(Document):
meta = {'collection': 'suppliers'}
name = StringField(required=True, max_length=200)
region = StringField(max_length=100)
categories = ListField(StringField())
rating = FloatField(min_value=0, max_value=5, default=0)
created_at = DateTimeField(default=datetime.utcnow)
updated_at = DateTimeField(default=datetime.utcnow)
def to_dict(self):
return {
"id": str(self.id),
"name": self.name,
"region": self.region,
"categories": self.categories,
"rating": self.rating
}
4.4 数据库环境架构总览
下图展示了智能寻源算法中数据库环境的整体架构,包括关系型数据库、NoSQL 数据库、连接池与 ORM 层的协作关系。
4.5 配置验证与测试
完成安装与配置后,需执行以下验证步骤确保数据库环境可用:
- 连接测试: 使用命令行客户端或编程语言驱动尝试连接各数据库,确认用户名、密码、端口正确。
- 连接池压力测试: 模拟并发请求,观察连接池是否按配置创建/回收连接,无泄漏或超时。
- ORM 模型同步: 执行
Base.metadata.create_all(engine)或Supplier.ensure_indexes(),确认表/集合创建成功。 - 读写分离验证: 若配置了主从或副本集,验证写操作路由到主节点,读操作可分发到从节点。
常见问题:
- 连接池耗尽:检查
pool_size与max_overflow是否匹配并发峰值,必要时增加连接数或优化查询。 - ORM 模型字段变更未同步:使用迁移工具(Alembic / Mongomigrate)管理 schema 版本,避免手动修改数据库。
- Redis 内存溢出:配置
maxmemory与合理的淘汰策略(如 allkeys-lru),并监控内存使用率。
通过以上配置与验证,智能寻源算法将获得稳定、高效的数据库支撑,为后续品类策略计算与寻源匹配奠定坚实基础。