- 简介
- 项目结构
- 核心组件
- 架构概览
- 详细组件分析
- 依赖关系分析
- 性能考虑
- 故障排除指南
- 结论
本文档详细说明了应用安装相关的数据库表结构,包括应用安装包表(app_install_package)和设备安装设备表(app_install_device)的设计与实现。该系统采用分库分表策略,通过包名和设备维度对应用安装数据进行高效存储和查询。
系统主要服务于设备端应用安装监控,支持大规模设备的应用安装数据收集、存储和分析,为设备管理、应用统计和运维监控提供数据支撑。
项目结构
应用安装相关的核心文件组织如下:
Mermaid Diagram Code:
graph TB
subgraph "应用安装模块"
A[AppInstallPackageDO<br/>包维度数据对象]
B[AppInstallDeviceDO<br/>设备维度数据对象]
C[AppInstallUtil<br/>分区工具类]
end
subgraph "数据库表"
D[app_install_package<br/>包维度表]
E[app_install_device<br/>设备维度表]
F[apk_push_history<br/>推送历史表]
end
subgraph "分析存储"
G[TDengine数据库<br/>app_install]
end
A --> D
B --> E
C --> D
C --> E
D --> G
E --> G
图表来源
章节来源
核心组件
应用安装包表 (app_install_package)
应用安装包表是按包维度存储应用安装信息的核心表,采用复合主键设计,支持超大规模数据存储。
表结构定义:
| 字段名 | 数据类型 | 约束条件 | 描述 |
|---|
| id | bigint | 主键, 自增 | 自增主键 |
| package_name | varchar(512) | 非空 | 应用包名,标签字段 |
| mac | varchar(255) | 可空 | 设备MAC地址 |
| cpu_id | varchar(255) | 可空 | CPU标识符 |
| app_name | varchar(512) | 可空 | 应用名称 |
| class_name | varchar(512) | 可空 | 启动类名 |
| version_name | varchar(255) | 可空 | 应用版本名称 |
| version_code | bigint | 可空 | 应用版本号 |
| is_syste_app | int | 可空 | 是否系统应用 |
| last_undate_time | datetime | 可空 | 采集时间 |
| create_time | datetime | 可空 | 创建时间(设备维度带过来) |
| update_time | datetime | 可空 | 更新时间(设备维度带过来) |
| partition_index | int | 非空 | 分区索引 |
索引设计:
- 主键:(id, partition_index)
- 辅助索引:(mac, cpu_id)
- 复合索引:(package_name, version_code)
设备安装设备表 (app_install_device)
设备安装设备表是按设备维度存储应用安装信息的表,支持JSON格式存储应用列表。
表结构定义:
| 字段名 | 数据类型 | 约束条件 | 描述 |
|---|
| id | int | 主键, 自增 | 主键 |
| mac | varchar(255) | 可空 | 设备MAC地址 |
| cpu_id | varchar(255) | 可空 | CPU标识符 |
| last_undate_time | datetime | 可空 | 设备端采集时间 |
| app_count | int | 可空 | 应用数量 |
| create_time | datetime | 可空 | 创建时间 |
| update_time | datetime | 可空 | 更新时间 |
| apps | json | 可空 | 应用信息集合 |
| partition_index | int | 非空 | 分区索引 |
索引设计:
- 主键:(id, partition_index)
- 唯一索引:(mac, cpu_id, partition_index)
- 辅助索引:app_count
章节来源
架构概览
系统采用多层架构设计,结合MySQL分库分表和TDengine时序数据库,实现高性能的应用安装数据存储和分析。
Mermaid Diagram Code:
graph TB
subgraph "数据采集层"
A[设备端上报]
B[消息队列]
end
subgraph "数据处理层"
C[AppInstallUtil<br/>分区策略]
D[数据转换器<br/>包维度/设备维度]
end
subgraph "存储层"
E[MySQL分库分表<br/>app_install_package]
F[MySQL分库分表<br/>app_install_device]
G[TDengine时序数据库<br/>app_install]
end
subgraph "分析层"
H[统计分析]
I[报表生成]
end
A --> B
B --> C
C --> D
D --> E
D --> F
E --> G
F --> G
G --> H
H --> I
图表来源
详细组件分析
分区策略组件
AppInstallUtil类实现了智能的分区策略,确保数据在不同维度上的均匀分布。
Mermaid Diagram Code:
classDiagram
class AppInstallUtil {
+int PACKAGE_PARTITION_COUNT
+int MAC_CPU_PARTITION_COUNT
+Map~String,Integer~ PACKAGE_PARTITION_MAP
+getPartitionByMacCpu(mac, cpu) int
+getPartitionByPackageName(packageName) int
+tableNotExistAndCreate(tableName, ddlPath) boolean
+getPartitionNameByMacCpu(mac, cpu) String
+getPartitionNameByPackageName(packageName) String
}
class AppInstallPackageDO {
+Long id
+String packageName
+String mac
+String cpuId
+String appName
+String className
+String versionName
+Long versionCode
+Boolean isSysteApp
+Date lastUndateTime
+Date createTime
+Date updateTime
+int partitionIndex
+getPartitionIndex() int
}
class AppInstallDeviceDO {
+Integer id
+String mac
+String cpuId
+Date lastUndateTime
+Integer appCount
+Date createTime
+Date updateTime
+String apps
+int partitionIndex
+getPartitionIndex() int
}
AppInstallPackageDO --> AppInstallUtil : "使用分区策略"
AppInstallDeviceDO --> AppInstallUtil : "使用分区策略"
图表来源
数据转换流程
系统支持从设备维度向包维度的数据转换,实现更细粒度的应用安装统计。
Mermaid Diagram Code:
sequenceDiagram
participant Device as 设备端
participant Util as AppInstallUtil
participant Package as app_install_package
participant DeviceTable as app_install_device
Device->>DeviceTable : 上报设备应用列表
DeviceTable->>Util : 计算分区索引
Util-->>DeviceTable : 返回分区信息
DeviceTable->>DeviceTable : 存储设备维度数据
Note over DeviceTable : 数据转换过程
DeviceTable->>Util : 解析应用列表
Util-->>DeviceTable : 逐个应用计算包维度分区
DeviceTable->>Package : 转换为包维度存储
Package->>Package : 批量插入数据
图表来源
数据生命周期管理
系统实现了完善的数据生命周期管理策略:
Mermaid Diagram Code:
flowchart TD
Start([数据到达]) --> Validate["验证数据完整性"]
Validate --> Partition["计算分区索引"]
Partition --> StoreDevice["存储设备维度数据"]
StoreDevice --> Transform["转换为包维度数据"]
Transform --> StorePackage["存储包维度数据"]
StorePackage --> Analyze["统计分析"]
Analyze --> Archive["历史归档"]
Archive --> Cleanup["清理过期数据"]
Cleanup --> End([完成])
Validate --> |数据无效| Error["错误处理"]
Error --> End
章节来源
依赖关系分析
应用安装系统的依赖关系呈现清晰的层次化结构:
Mermaid Diagram Code:
graph TB
subgraph "外部依赖"
A[MySQL数据库]
B[Redisson分布式锁]
C[TDengine时序数据库]
end
subgraph "核心模块"
D[AppInstallUtil工具类]
E[数据对象层]
F[DAO层]
end
subgraph "业务逻辑"
G[数据转换服务]
H[分区管理服务]
I[统计分析服务]
end
A --> D
B --> D
C --> I
D --> E
E --> F
F --> G
G --> H
H --> I
图表来源
章节来源
性能考虑
分区策略优化
系统采用双重分区策略确保数据分布均匀:
- 包维度分区:基于包名哈希值,支持59个分区
- 设备维度分区:基于MAC+CPU组合哈希值,支持150个分区
- 特殊包名映射:前41个特殊包名映射到负数分区,便于特殊处理
查询优化
- 复合索引设计:针对常用查询模式优化索引结构
- 分区裁剪:利用分区键进行查询裁剪,减少扫描范围
- 批量操作:支持批量插入和更新,提高写入性能
内存管理
- 分区映射缓存:特殊包名分区映射使用HashMap缓存
- 连接池管理:合理配置数据库连接池参数
- 内存限制:批量操作设置大小限制,避免内存溢出
故障排除指南
常见问题及解决方案
问题1:分区表创建失败
- 检查Redisson分布式锁配置
- 验证数据库权限设置
- 确认表名格式正确
问题2:数据分区不均匀
- 检查包名哈希算法
- 验证分区映射配置
- 分析特殊包名使用情况
问题3:查询性能下降
- 检查索引使用情况
- 分析查询计划
- 考虑添加合适的索引
章节来源
应用安装表设计体现了现代大数据存储的最佳实践,通过合理的分库分表策略、智能的分区算法和完善的生命周期管理,实现 了高性能的应用安装数据存储和分析能力。
系统的主要优势包括:
- 高扩展性:支持大规模设备和应用数据存储
- 高性能:通过分区和索引优化查询性能
- 灵活性:支持包维度和设备维度的双视角分析
- 可靠性:完善的错误处理和数据一致性保障
该设计为设备管理、应用统计和运维监控提供了坚实的数据基础,能够满足大规模应用场景的需求。