数据库管理工具

一个使用Docker容器化和PostgreSQL的数据库管理项目,展示模式设计、性能优化和MCP工具集成。

  • by SANJAYBAIRI8686
  • Python
  • 本地部署
  • 2 星标
  • 更新于
在 GitHub 查看 SANJAYBAIRI8686/MCP

使用说明

使用MCP进行PostgreSQL数据库管理

一个全面的数据库管理项目,演示了Docker容器化、PostgreSQL设置、模式设计和使用模型上下文协议(MCP)工具的数据库性能优化。

📋 目录

🎯 项目概述

这个项目通过一个生产就绪的PostgreSQL设置展示了现代数据库管理实践。它表明:

  • 容器化数据库基础架构:基于Docker的PostgreSQL 16部署
  • 模式设计:具有4个核心表的标准化电子商务数据库
  • 性能优化:自动化数据库审计和索引建议
  • 健康监测:缓存命中率分析和查询性能指标
  • MCP集成:使用模型上下文协议工具的数据库操作

数据库统计

度量 值
表格总数 4
总记录数 约43000行
数据库大小 约3.5 MB
缓存命中率 99.94%
客户 2,000
订单 10,000
项目 30,000
产品 1,000

✨ 特性

  • 🔧 Docker容器化:独立的PostgreSQL 16环境
  • 📊 数据库审核:自动健康检查和性能分析
  • 🔍 指标优化:标识外键上缺少的索引
  • 📈 性能指标:缓存命中率监控和查询分析
  • 🛠️ 自动脚本:基于Python的数据库管理工具
  • 📝 综合文档:模式文档、快速入门指南和投资组合资源

🏗️ 建筑

数据库模式

该项目实现了一个具有以下结构的规范化电子商务数据库:

核心表

  1. customers -客户信息,包括注册详细信息、国家和级别
  2. orders -包含状态、金额和区域数据的订单记录
  3. products -产品目录,包括类别、定价和库存水平
  4. order_items -连接订单与数量产品的连接表

实体关系

customers (1) ────< (many) orders (1) ────< (many) order_items
                                                        │
                                                        │ (many)
                                                        │
                                              products (1)
  • customers → orders (一对多)
  • orders → order_items (一对多)
  • products → order_items (一对多)

系统架构

┌─────────────────┐
│   Python Script │
│    (main.py)    │
└────────┬────────┘
         │
         │ Docker Exec
         ▼
┌─────────────────┐
│  Docker Container│
│   (pg-local)    │
│                 │
│  PostgreSQL 16  │
│  Port: 5433     │
└─────────────────┘

📊 数据库模式

实体关系图

erDiagram
    CUSTOMERS ||--o{ ORDERS : "places"
    ORDERS ||--o{ ORDER_ITEMS : "contains"
    PRODUCTS ||--o{ ORDER_ITEMS : "included_in"
    
    CUSTOMERS {
        int customer_id PK
        varchar email
        date registration_date
        varchar country
        varchar tier
    }
    
    ORDERS {
        int order_id PK
        int customer_id FK
        date order_date
        varchar status
        numeric total_amount
        varchar region
    }
    
    PRODUCTS {
        int product_id PK
        varchar name
        varchar category
        numeric price
        int stock_quantity
    }
    
    ORDER_ITEMS {
        int item_id PK
        int order_id FK
        int product_id FK
        int quantity
        numeric price
    }

表详细信息

有关详细的表模式、列定义和关系,请参见 docs/database_schema.md.

🛠️ 使用的技术

  • PostgreSQL 16:企业级关系数据库管理系统
  • 码头工人:用于孤立数据库环境的容器化平台
  • MCP(模型上下文协议):数据库管理和操作工具
  • Python 3.12+:用于自动化和数据库管理的脚本语言
  • 结构化查询语言:用于模式设计和优化的数据库查询语言

📦 先决条件

在开始之前,请确保已安装以下内容:

  • Docker桌面 (或Docker引擎)- 安装Docker
  • Python 3.12或更高版本 - 安装Python
  • MCP服务器 已配置(Docker和PostgreSQL MCP)-可选,但建议
  • Git -用于克隆存储库

🚀 安装和设置

步骤1:克隆存储库

git clone <repository-url>
cd MCP-data-series

步骤2:创建PostgreSQL容器

使用以下配置启动PostgreSQL 16容器:

docker run -d \
  --name pg-local \
  -p 5433:5432 \
  -e POSTGRES_USER=app \
  -e POSTGRES_PASSWORD=app \
  -e POSTGRES_DB=demo \
  postgres:16

备注:集装箱使用港口 5433 避免与端口上的本地PostgreSQL安装冲突 5432.

步骤3:验证容器是否正在运行

docker ps | grep pg-local

您应该看到容器正在运行。如果没有,请检查日志:

docker logs pg-local

步骤4:创建架构并设置权限

连接到数据库并创建架构:

docker exec -i pg-local psql -U app -d demo << EOF
-- Grant permissions
GRANT ALL PRIVILEGES ON DATABASE demo TO app;

-- Create schema
CREATE SCHEMA IF NOT EXISTS app AUTHORIZATION app;
EOF

步骤5:加载样本数据

使用架构和数据加载示例数据库:

docker exec -i pg-local psql -U app -d demo < demo_data.sql

这将创建所有表,并用约43000条示例记录填充它们。

步骤6:验证安装

运行数据库审核脚本以验证一切正常:

python main.py

您应该看到显示表、统计信息、缓存性能和索引审核结果的输出。

💻 用法

正在运行数据库操作

执行主脚本以执行全面的数据库审核:

python main.py

预期产量:

============================================================
PostgreSQL Database Management - Portfolio Project
============================================================

📊 Database Tables:
------------------------------------------------------------
  ✓ customers
  ✓ order_items
  ✓ orders
  ✓ products

📈 Table Statistics:
------------------------------------------------------------
[Table statistics with row counts and sizes]

💾 Cache Performance:
------------------------------------------------------------
  Cache Hit Rate: 99.94% ✅ Excellent

🔍 Index Audit:
------------------------------------------------------------
  Missing indexes on foreign keys:
    ⚠️  orders.customer_id
    ⚠️  order_items.order_id
    ⚠️  order_items.product_id

🚀 Optimization Recommendations:
------------------------------------------------------------
  CREATE INDEX idx_orders_customer_id ON app.orders(customer_id);
  CREATE INDEX idx_order_items_order_id ON app.order_items(order_id);
  CREATE INDEX idx_order_items_product_id ON app.order_items(product_id);

连接到数据库

直接连接到PostgreSQL数据库:

docker exec -i pg-local psql -U app -d demo

使用PostgreSQLManager类

这 PostgreSQLManager 类为数据库操作提供了多种方法:

from main import PostgreSQLManager

# Initialize manager
db = PostgreSQLManager()

# List all tables
tables = db.list_tables()
print(tables)

# Get table statistics
stats = db.get_table_stats()
print(stats)

# Check cache hit rate
cache_rate = db.get_cache_hit_rate()
print(f"Cache Hit Rate: {cache_rate}%")

# Check for missing indexes
missing = db.check_indexes()
print(missing)

# Generate optimization SQL
sql_statements = db.generate_optimization_sql()
for sql in sql_statements:
    print(sql)

示例查询

加入客户和订单

SELECT 
    o.order_id,
    o.order_date,
    o.total_amount,
    c.email,
    c.country,
    c.tier
FROM app.orders o
JOIN app.customers c ON o.customer_id = c.customer_id
LIMIT 100;

获取产品订单详细信息

SELECT 
    oi.item_id,
    o.order_date,
    p.name as product_name,
    p.category,
    oi.quantity,
    oi.price
FROM app.order_items oi
JOIN app.orders o ON oi.order_id = o.order_id
JOIN app.products p ON oi.product_id = p.product_id
WHERE o.order_date > '2025-01-01'
LIMIT 100;

📈 性能优化

已识别的问题

数据库审计发现了三个关键的性能瓶颈:

  1. 缺少索引 orders.customer_id:导致对10K行表进行顺序扫描
  2. 缺少索引 order_items.order_id:30K行表上的顺序扫描
  3. 缺少索引 order_items.product_id:连接时性能下降

优化查询

应用推荐的指标来提高性能:

-- Create foreign key indexes
CREATE INDEX idx_orders_customer_id ON app.orders(customer_id);
CREATE INDEX idx_order_items_order_id ON app.order_items(order_id);
CREATE INDEX idx_order_items_product_id ON app.order_items(product_id);

-- Update statistics for query planner
ANALYZE app.orders;
ANALYZE app.order_items;

预期性能改进

优化 预期改进
orders.customer_id 索引 加入速度提高30-50%
order_items.order_id 索引 查询速度提高40-60%
order_items.product_id 索引 产品查询改善35-50%

验证优化

创建索引后,验证改进:

-- Check index usage
SELECT 
    schemaname,
    tablename,
    indexname,
    idx_scan as index_scans
FROM pg_stat_user_indexes
WHERE schemaname = 'app'
ORDER BY idx_scan DESC;

🔍 数据库审核结果

问题 影响 优先级 状态
缺少FK索引 对大型表进行顺序扫描 高 ✅ 已识别
缓存命中率 99.94%(优秀) - ✅ 最佳
查询性能 0.448ms执行时间 - ✅ 很好

健康检查指标

  • 缓存命中率:99.94%(优秀-目标:>99%)
  • 查询执行时间:0.448ms(性能良好)
  • 数据库大小:约3.5 MB(高效存储)
  • 索引覆盖率:发现3个缺失索引

📁 项目结构

MCP-data-series/
├── README.md                    # This file - comprehensive project documentation
├── QUICK_START.md              # Quick setup guide
├── PORTFOLIO_GUIDE.md          # Portfolio presentation guide
├── main.py                     # Database operations and audit script
├── pyproject.toml              # Python project configuration
├── demo_data.sql               # Database schema and sample data (43K+ records)
├── .gitignore                  # Git ignore patterns
├── .python-version             # Python version specification
└── docs/                       # Additional documentation
    ├── database_schema.md      # Detailed schema documentation
    └── portfolio-presentation.md # Portfolio presentation tips

🎓 展示的关键学习和技能

该项目展示了在以下方面的熟练程度:

  1. 容器编排

    • Docker容器生命周期管理
    • 端口映射和配置
    • 容器网络和隔离
  2. 数据库设计

    • 电子商务系统的规范化模式设计
    • 外键关系和引用完整性
    • 数据建模最佳实践
  3. 性能调整

    • 使用EXPLAIN ANALYZE进行查询分析
    • 指数优化策略
    • 缓存监控和优化
    • 执行计划分析
  4. 数据库管理

    • 用户和权限管理
    • 模式创建和组织
    • 数据库健康监控
    • 自动化审计脚本
  5. MCP集成

    • 使用模型上下文协议进行数据库操作
    • 自动化数据库管理工作流程
  6. 查询优化

    • 识别性能瓶颈
    • 创建战略指标
    • 分析查询执行计划
    • 衡量绩效改进
  7. 数据库健康监控

    • 缓存命中率分析
    • 指数覆盖审计
    • 查询性能指标
    • 自动健康检查

📚 文档

🐛 故障排除

端口5432已在使用中

容器配置为使用端口 5433 默认情况下。如果您需要使用其他端口:

docker run -d \
  --name pg-local \
  -p <your-port>:5432 \
  -e POSTGRES_USER=app \
  -e POSTGRES_PASSWORD=app \
  -e POSTGRES_DB=demo \
  postgres:16

容器已存在

如果容器名称冲突:

docker rm -f pg-local

然后使用设置说明重新创建容器。

无法连接到数据库

  1. 检查集装箱状态:

    docker ps -a | grep pg-local
    
  2. 检查容器日志:

    docker logs pg-local
    
  3. 如果需要,重新启动容器:

    docker start pg-local
    

权限被拒绝错误

确保 app 用户具有适当的权限:

docker exec -i pg-local psql -U app -d demo -c "GRANT ALL PRIVILEGES ON SCHEMA app TO app;"

🤝 贡献

这是一个展示数据库管理技能的投资组合项目。欢迎提出意见、建议和改进!

  1. 分叉存储库
  2. 创建要素分支(git checkout -b feature/amazing-feature)
  3. 提交您的更改(git commit -m 'Add some amazing feature')
  4. 推到分支(git push origin feature/amazing-feature)
  5. 打开拉取请求

📄 许可证

此项目根据MIT许可证获得许可-有关详细信息,请参阅许可证文件。

欢迎将此作为学习资源!

🙏 致谢

  • PostgreSQL社区 -优秀的文档和工具
  • 码头工人 -用于集装箱化平台
  • MCP协议 -用于数据库管理工具
  • Python社区 -用于强大的数据库库

🎯 项目亮点

作为投资组合项目的一部分构建,展示:

  • ✅ 真实世界的数据库管理技能
  • ✅ 生产就绪的PostgreSQL设置
  • ✅ 性能优化专业知识
  • ✅ 容器编排熟练程度
  • ✅ 自动化数据库管理
  • ✅ 全面的文件

关键指标:

  • 📊 管理43000+条记录
  • ⚡ 99.94%的缓存命中率
  • 🚀 已确定40-60%的性能改进
  • 🔧 建议进行3项关键优化

有关快速设置,请参阅 快速启动.md
关于投资组合的展示,请参见 投资组合指南.md