以《本草纲目》为代表的中医药数据有其特殊性,例如大量的非结构化文本和多种实体间复杂的关联。
因此,在实践中,一个完善"中医药主题数据库"的项目,通常不会是单一的PostgreSQL,而是一个"PostgreSQL + Neo4j"的混合架构:
- PostgreSQL:负责存储和高效管理结构化的核心"数据底盘"(如药材、方剂的明确属性)。
- Neo4j:用于构建复杂的"知识网络"(如"黄芪配伍当归"、"黄连主治痢疾"等知识间的关联),实现深度推理和知识发现。
📊 第一步:数据模型设计(以《本草纲目》为例)
这是构建整个数据库的蓝图。我们需要分析《本草纲目》的知识体系,将其抽象为"实体"(名词)和"关系"(动词)。
1. 核心实体识别
以下是《本草纲目》等中医药数据库建模的必选实体:
- 药材(Herb):数据库的核心。包括药材的名称、别名、来源、出处等。
- 方剂(Formula):由多味药材按"君臣佐使"配伍而成的配方。
- 功效(Efficacy):药材或方剂的功能主治,例如"清热解毒"、"活血化瘀"。
- 主治(Indication):药材或方剂针对的病症,如"风热感冒"、"湿热泻痢"。
- 性味(Nature & Flavor):四气(寒、热、温、凉)和五味(酸、苦、甘、辛、咸)。
- 归经(Meridian Tropism):药材对特定脏腑经络的选择性作用,例如"归肺经"。
- 炮制(Processing Method):药材在应用前的加工方法,如"酒制"、"蜜炙"。
- 产地(Origin):药材的原产地,"道地药材"概念。
- 用药禁忌(Contraindication):十八反、十九畏、妊娠禁忌等。
- 证型(Syndrome):中医辨证论治的结果,如"肝阳上亢证"、"风寒束表证"。
2. 核心关系构建
这些实体间的联系,定义了数据库的关系 。比如"药材-方剂 "的多对多关系,是建立方剂配伍的逻辑基础。
| 实体A | 关系 | 实体B | 说明 |
|---|---|---|---|
| 药材 | 方剂组成 (Formula-Composed) | 方剂 | 指该方剂中包含哪些药材。 |
| 药材 | 具有功效 (Has-Efficacy) | 功效 | 如"黄连-具有功效-清热燥湿"。 |
| 药材 | 主治病症 (Treats-Indication) | 主治 | 如"麻黄-主治病症-风寒感冒"。 |
| 药材 | 位于产地 (Located-in) | 产地 | 如"三七-位于产地-云南文山"。 |
| 药材 | 用药禁忌 (Contraindicated-with) | 药材 | 描述配伍禁忌,如"甘草-禁忌-甘遂"。 |
| 药材 | 药性为 (Has-TCM-Property) | 性味归经 | 描述药材的性味和归经属性。 |
| 方剂 | 主治证候 (Treats-Syndrome) | 证型 | 描述方剂对应的中医证型。 |
🛠️ 第二步:PostgreSQL 实现方案
1. 数据库环境搭建
-
基础环境 :建议使用 PostgreSQL 14+ 或更新的版本。
-
Schema划分 :使用
CREATE SCHEMA命令来管理对象,规划出core(核心表)、reference(参考数据)、search(全文检索)等模式。 -
扩展安装 :执行SQL命令
CREATE EXTENSION以启用所需扩展。sqlCREATE EXTENSION IF NOT EXISTS "uuid-ossp"; -- 用于生成全局唯一ID CREATE EXTENSION IF NOT EXISTS "ltree"; -- 用于处理层级数据(如药材分类) -- 中文分词扩展(zhparser 或 pg_jieba) CREATE EXTENSION zhparser;
2. 核心表结构设计
基于上述实体,以下是核心的建表示例(展示主要字段):
core.herbs - 药材主表
sql
CREATE TABLE core.herbs (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name VARCHAR(100) NOT NULL, -- 药材名
alias TEXT, -- 别名,JSON格式或独立表
latin_name VARCHAR(255), -- 拉丁学名
source TEXT, -- 来源,如《本草纲目》记载
description TEXT, -- 描述
UNIQUE (name)
);
core.formulas - 方剂表
sql
CREATE TABLE core.formulas (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
name VARCHAR(100) NOT NULL, -- 方剂名
source TEXT, -- 来源典籍
description TEXT, -- 方解
UNIQUE (name)
);
core.tcm_properties - 性味归经等属性表
sql
CREATE TABLE core.tcm_properties (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
property_type VARCHAR(50), -- 类型:Nature, Flavor, Meridian
property_value VARCHAR(50) -- 值:如"寒"、"甘"、"肺经"
);
core.herb_properties - 药材-属性关联表
sql
CREATE TABLE core.herb_properties (
herb_id UUID REFERENCES core.herbs(id) ON DELETE CASCADE,
property_id UUID REFERENCES core.tcm_properties(id),
PRIMARY KEY (herb_id, property_id)
);
core.formula_herbs - 方剂-药材关联表
sql
CREATE TABLE core.formula_herbs (
formula_id UUID REFERENCES core.formulas(id) ON DELETE CASCADE,
herb_id UUID REFERENCES core.herbs(id),
dosage VARCHAR(50), -- 剂量(克)
role VARCHAR(50), -- 君臣佐使角色
PRIMARY KEY (formula_id, herb_id)
);
core.herb_relations - 药材关系表
sql
CREATE TABLE core.herb_relations (
herb_id UUID REFERENCES core.herbs(id),
related_herb_id UUID REFERENCES core.herbs(id),
relation_type VARCHAR(50), -- 如"反"、"畏"、"恶"、"杀"
PRIMARY KEY (herb_id, related_herb_id)
);
你需要将所有数据库对象都放到core这类特定的Schema下,并在应用层完成数据的录入和查询。
🔍 第三步:PostgreSQL 实用功能指南
1. 中文全文检索
中医药典籍包含大量古汉语描述,实现**全文检索(FTS)**是构建检索系统的关键。
- 方案选择 :
zhparser:基于词典的推荐方案。pg_jieba:基于词频统计的替代方案。pgroonga:插件实现快速检索。
- 实现步骤 :
- 安装扩展并创建文本搜索配置。
- 为需要搜索的文本列创建
tsvector类型的GIN索引。 - 使用
@@运算符和to_tsquery函数执行查询。
2. 处理复杂关系
- JSON/JSONB:将动态或半结构化的数据(如药材的"用法用量"说明)存储为JSONB列。
- ltree :使用
ltree扩展高效存储和查询层级数据(如药材的"界-门-纲-目-科-属-种"分类)。
3. 数据库性能优化
- 索引选择 :除了FTS用GIN索引,对于
WHERE、JOIN、ORDER BY等高频率的精确查询列,应创建B-Tree索引。 - 物化视图:将统计类的结果存储在物化视图中,并设置定期刷新计划。
- 分区表:当数据量巨大时(如海量用户问诊记录),使用内置的声明式分区提升查询和维护效率。
🌐 实用指南与扩展补充
1. 数据采集与整合
你可以通过多种途径采集数据:
- 公开的结构化数据集:网络公开的中医药数据集。
- 官方权威数据库:整合中国中药数据库、中国方剂数据库等官方数据。
- 网页数据采集:编写爬虫(如Python)采集专业中医药网站信息。
- PDF/扫描件:使用NLP技术从《本草纲目》等典籍PDF中抽取实体关系。
2. 数据校验与清洗
- 数据标准化:统一不同来源药材、功效术语,构建同义词库。
- 数据约束 :利用
CHECK约束、外键约束保证数据准确性。 - 清洗流程:建立定期执行的脚本,处理重复、无效和不完整数据。
3. 数据可视化与安全
- 可视化:利用ECharts等库将分析结果以图表展示。
- 安全性 :谨慎管理pg_hba.conf文件,按需配置用户权限防止越权操作。
💎 总结
构建一个《本草纲目》主题数据库的关键,在于深刻理解中医药知识的复杂性,并选择一个清晰、可扩展的架构。你可以先选择一个小型、完整的场景(如上百味药的某个方剂数据),从 herbs和 formulas 两张表开始。
这趟项目之旅,将由你亲手赋予古籍中的数据以新的生命。