Redis
一、Redis 主要作用与核心特性
高性能内存存储
数据存储在内存中,读写速度极快(微秒级响应),支持高并发访问。
持久化能力
支持 RDB(快照)和 AOF(追加日志)两种持久化方式,确保重启后数据不丢失。
丰富的数据类型
字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)等,满足不同业务需求。
分布式支持
支持主从复制、哨兵(Sentinel)、集群(Cluster)模式,实现高可用与水平扩展
二、典型应用场景
场景 说明 数据结构
缓存 加速热点数据访问(如商品信息、页面内容),减轻数据库压力 String/Hash
会话存储 存储用户登录状态(如购物车数据),支持分布式服务共享会话 Hash/String
分布式锁 通过 SETNX 实现跨服务资源互斥访问 String
排行榜/计数器 利用有序集合(ZSet)实现实时排序(如游戏排名),INCR 统计访问量 ZSet/String
消息队列 列表(List)实现简单队列(生产者-消费者模型) List
实时数据分析 统计在线用户数、实时点击量等 Set/HyperLogLog
常用命令速查
命令 作用 示例
KEYS pattern 匹配键名(生产慎用,建议用 SCAN 替代) KEYS user:*
EXISTS key 检查键是否存在 EXISTS user:1001
DEL key 删除键 DEL cache:data
EXPIRE key sec 设置键过期时间(秒)811 EXPIRE session 3600
TTL key 查看剩余过期时间 TTL session
数据类型操作
String(字符串)
SET key value # 设置值
GET key # 获取值
INCR key # 数值自增1(计数器)
INCRBY key 5 # 数值增加5
MSET k1 v1 k2 v2 # 批量设置键值
典型场景:缓存热点数据、计数器(如文章阅读量)
Hash(哈希)
HSET user:1001 name “Alice” # 设置字段
HGET user:1001 name # 获取字段
HGETALL user:1001 # 获取所有字段
HINCRBY user:1001 score 10 # 字段值递增
典型场景:存储对象属性(如用户信息)
List(列表)
LPUSH tasks “task1” # 左端插入
RPOP tasks # 右端弹出
LRANGE tasks 0 -1 # 获取全部元素
典型场景:消息队列、最新消息列表
Sorted Set(有序集合)
ZADD rank 100 “PlayerA” # 添加成员及分数
ZRANGE rank 0 9 WITHSCORES # 获取前10名(带分数)
典型场景:实时排行榜、优先级任务队列
SCAN 命令
功能与特点
迭代式查询:基于游标(cursor)分批次遍历数据库中的键,避免阻塞 Redis 单线程
非阻塞设计:每次返回少量键,游标为 0 时表示遍历完成
模式匹配:支持 MATCH 参数过滤键名(如 user:*)
弱一致性:遍历期间数据修改可能导致重复或遗漏
命令语法
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
cursor:起始游标(首次为 0)
COUNT:建议返回的键数量(实际可能不一致)
TYPE:过滤键类型(如 string、hash)
典型场景
替代 KEYS * 查询海量键名
定期清理符合特定模式的键(如过期缓存)
场景:遍历所有以 user: 开头的键
#第一次迭代(游标从0开始)
127.0.0.1:6379> SCAN 0 MATCH user:* COUNT 5
- “12” # 下次迭代的游标
- “user:1001” # 匹配到的键
- “user:1002”
#第二次迭代(使用返回的游标12继续)
127.0.0.1:6379> SCAN 12 MATCH user:* COUNT 5
- “0” # 游标为0表示遍历完成
- “user:1003”
- “user:1004”
HSCAN 命令
功能与特点
哈希表迭代:专用于遍历 Hash 类型中的字段和值
增量式获取:避免一次性获取大 Hash 导致内存压力
游标控制:与 SCAN 类似,通过游标分批次返回数据
命令语法
HSCAN key cursor [MATCH pattern] [COUNT count]
key:目标 Hash 键名。
MATCH:过滤字段名(如 user:*)
典型场景
替代 HGETALL 获取大 Hash 数据
统计 Hash 中部分字段(如用户属性子集)
SCAN 与 HSCAN 对比
特性 SCAN HSCAN
作用对象 整个数据库的键 指定 Hash 键的字段
复杂度 O(N)(分批次) O(N)(分批次)
适用场景 全局键管理 大 Hash 字段遍历
场景:遍历 Hash 键 user:profile 中的字段
#设置测试数据
127.0.0.1:6379> HSET user:profile name “Alice” age 28 email “alice@example.com“
#第一次迭代
127.0.0.1:6379> HSCAN user:profile 0 MATCH n* # 匹配以n开头的字段
- “0” # 游标0表示一次遍历完成(数据量小)
- “name” # 字段名
- “Alice” # 字段值
#遍历所有字段(分批次)
127.0.0.1:6379> HSCAN user:profile 0 COUNT 1
- “2” # 下次游标
- “name”
- “Alice”
127.0.0.1:6379> HSCAN user:profile 2 COUNT 1
- “0” # 遍历结束
- “age”
- “28”
- “email”
- “alice@example.com“
高阶应用命令
- 分布式锁
SET lock:res1 UUID NX EX 30 # 原子获取锁(30秒自动释放)
DEL lock:res1 # 释放锁
关键点:需配合唯一标识符避免误删,推荐 Lua 脚本保证原子性
发布订阅
SUBSCRIBE news # 订阅频道
PUBLISH news “Hello” # 发布消息
典型场景:实时通知系统事务
MULTI # 开启事务
SET a 100
INCR b
EXEC # 执行事务
注意:Redis 事务无回滚机制,命令错误仍会继续执行
MaFka vs Kafka
特性 Kafka MaFka
开发方 Apache开源 阿里云优化版
适用场景 通用消息队列、流处理 高可用、强一致性的金融场景
命令兼容性 原生Kafka命令 兼容Kafka,部分扩展API
核心运用场景
异步处理
场景:用户注册后异步发送邮件/短信,提升响应速度
示例:订单系统生成订单后,通过Kafka通知库存系统扣减库存
应用解耦
场景:电商系统中,支付成功事件通过Kafka通知物流、积分等子系统,避免直接调用
流量削峰
场景:秒杀活动中,请求先写入Kafka,后端服务按能力消费,避免系统崩溃
日志收集与实时分析
场景:收集服务器日志,通过Flink/Spark实时分析
事件驱动架构
场景:微服务间通过Kafka传递事件(如库存变更、用户行为)
http和thrift核心区别
维度 HTTP Thrift
协议类型 应用层协议 (文本/二进制传输) 跨语言 RPC 框架 (强制二进制传输)
设计目标 Web 资源传输 (如网页、API) 高效 服务间通信 (微服务、内部系统)
数据编码 支持文本 (JSON/XML) 或二进制 二进制编码 (体积小,解析快)
协议开销 头部较大 (如 Cookie/User-Agent) 精简二进制头部 (节省带宽)
跨语言支持 通用 (所有语言原生支持) 通过 IDL 生成多语言代码 (Java/Python/C++ 等) 14
二、主要用途
HTTP/HTTPS
Web 交互:浏览器-服务器通信 (如加载网页、API 调用)
开放 API:第三方服务集成 (如支付接口、地图服务)
内容分发:传输静态资源 (图片、CSS/JS 文件)
Thrift
微服务通信:服务间高性能数据交换 (如订单服务调用库存服务)
大数据管道:跨语言数据流转 (如 Java 服务向 Python 分析模块传输日志)
内部系统集成:统一通信协议替代 RESTful (降低序列化开销)
三、请求方式与示例
HTTP 请求方式
方法 用途 示例
GET 获取资源 curl http://api.com/users?id=1
POST 提交数据 (如创建资源) POST /users Body: {“name”:”Alice”}
PUT 更新完整资源 PUT /users/1 Body: {“name”:”Bob”}
DELETE 删除资源 DELETE /users/1
HEAD 获取响应头 (不含 body) HEAD /users → 返回状态码 200
Thrift 请求方式
无固定方法名,由 IDL 定义接口
定义接口文件 (user.thrift):
service UserService {
User getUser(1:i32 id), // 类似 GET 请求
void createUser(1:User user), // 类似 POST 请求
bool deleteUser(1:i32 id) // 类似 DELETE 请求
}
客户端调用 (Python 示例):
client = UserService.Client(protocol)
user = client.getUser(1) # 调用 getUser 方法
client.deleteUser(1) # 调用 deleteUser 方法
四、关键总结
选 HTTP 场景:
需浏览器兼容性 (如前端调用 API)
开放生态集成 (如 OAuth 认证)
选 Thrift 场景:
服务间 高性能通信 (延迟敏感型系统)
跨语言团队协作 (统一 IDL 减少沟通成本)
示例对比:传输 1KB 数据时,Thrift 比 HTTP/JSON 节省约 40% 带宽,解析速度快 3-5 倍
跨语言 RPC 框架,Remote Procedure Call(远程过程调用)
一、主要用途
微服务通信;支持不同语言编写的服务相互调用(如Java订单服务调用Python库存服务)
分布式系统集成:跨团队协作时统一通信协议(如C++数据分析模块与Go日志服务交互)48。
高性能数据交换:二进制协议减少序列化开销(如金融交易系统要求低延迟)
二、主流框架与示例
1. Thrift
用途:Facebook开源,支持15+语言,适用于大规模跨语言服务(如Hive底层通信)
示例:
// 定义接口(IDL文件)
service UserService {
string getUserName(1:i32 userId)
}
Java服务端实现接口,Python客户端直接调用
2. gRPC
用途:Google开发,基于HTTP/2,适合云原生(如Kubernetes组件通信)
示例:
// Protobuf定义
rpc SayHello (HelloRequest) returns (HelloReply) {}
Go服务端与Node.js客户端双向流通信
3. Dubbo
用途:阿里开源,扩展性强(如电商系统多语言服务治理)
示例:
Java服务暴露接口,通过Zookeeper注册,PHP消费者调用
⚖️ 三、关键优势
框架 核心优势
Thrift 轻量级,多语言支持完善
gRPC 流式传输,HTTP/2天然支持
Dubbo 服务治理能力强(熔断、负载均衡)
注:选择时需权衡语言支持、性能需求及生态集成
Squirrel 协议和 Thrift 协议
特性 Thrift 协议 Squirrel 协议
协议类型 跨语言 RPC 框架(含序列化+传输层) 分布式通信优化协议(聚焦传输层性能)
主要用途 跨语言服务调用(如微服务接口) 大数据系统内部数据传输(如 Spark shuffle)
技术栈 包含 IDL 编译器、序列化库、传输协议 专注于 零拷贝、流式压缩、内存管理
典型应用系统 Hive、Cassandra、Facebook 内部服务 Apache Spark(替代 Netty 的传输模块)
数据格式 支持二进制/JSON/Compact 等序列化 原生二进制流(无序列化概念)
一、Thrift 协议详解
核心用途
跨语言服务通信
通过 IDL 定义接口 → 生成多语言(Java/Python/C++)的 RPC 客户端/服务端代码 → 实现异构系统调用。
高效序列化传输
支持二进制编码,减少数据体积,提升传输效率。
常用命令/操作示例
// 定义接口 (user_service.thrift)
service UserService {
string getUserName(1:i32 userId),
bool updateUser(1:User user)
}
struct User {
1: i32 id,
2: string name
}
生成 Java 代码:
thrift --gen java user_service.thrift # 生成 UserService 客户端调用类
调用示例(Java):
TTransport transport = new TSocket("localhost", 9090);
transport.open();
TProtocol protocol = new TBinaryProtocol(transport);
UserService.Client client = new UserService.Client(protocol);
// 调用远程方法
String name = client.getUserName(123);
System.out.println(name); // 输出 "Alice"
二、Squirrel 协议详解
核心用途
大数据引擎内部数据传输优化
用于 Spark/Flink 等计算引擎的 Shuffle 阶段,替代传统 TCP 传输:
零拷贝:避免 JVM 堆内外内存复制
流式压缩:实时压缩传输中的数据块
内存池化:减少 GC 压力
技术实现特征
无 IDL 定义:直接传输二进制内存块(如 Spark 的 ManagedBuffer)
基于 Netty 改造:扩展了 TransportClient/TransportServer
Spark 中的示例(源码层面)
scala
Copy Code
// Spark 使用 Squirrel 传输 shuffle 数据
val blockData = shuffleBlockManager.getBlockData(blockId)
val buffer = blockData.toByteBuffer()
// 通过 Squirrel 协议发送
transportClient.sendRpc(buffer, callback)
三、典型场景对比
场景 1:微服务 API 调用(Thrift)
架构:
graph LR
Web[Java Web App] -- Thrift RPC --> UserService[Python UserService]
UserService --> DB[(MySQL)]
```
流程:
Java 应用通过 Thrift 生成的客户端调用 Python 服务的 getUserName() 接口。
场景 2:Spark Shuffle 数据传输(Squirrel)
架构:
```mermaid
graph LR
Executor1[Spark Executor 1] -- Squirrel协议 --> Executor2[Spark Executor 2]
Executor2 -- 处理shuffle数据 --> Task[计算任务]
优化效果:
100 GB 的 Shuffle 数据,经流式压缩后传输体积降至 40 GB,传输耗时减少 60%
Q:两者能否替代使用?
→ 不能!
Thrift 解决 跨语言服务调用(类似 gRPC)
Squirrel 解决 大数据引擎内部高性能传输(类似 RDMA 优化)
Q:实际项目中如何识别?
Thrift:存在 .thrift 接口定义文件,生成多语言 SDK
Squirrel:出现在 Spark/Flink 等引擎的 网络传输模块配置中(如 spark.shuffle.squirrel.enabled=true)
💡 性能对比:在 Spark Shuffle 场景下,Squirrel 较传统 TCP 协议降低 30%~50% 延迟,同时减少 50% CPU 占用(来源:Databricks 性能报告)
Hive
一、核心用途
大数据分析平台:提供 类SQL(HiveQL)接口,将结构化数据文件(如日志、CSV)映射为表结构,支持海量数据分析 → 适合网站PV/UV统计、用户行为分析
Hadoop 数据仓库
基于 HDFS 存储,通过元数据管理(Metastore)统一管理表结构、分区等属性 → 避免直接操作分布式文件系统。
简化 MapReduce 开发
自动转换 HQL 为 MapReduce 任务(或 Spark/Tez),降低分布式计算门槛 → 开发者无需编写 Java 代码
二、常用命令与示例
1. 数据定义(DDL)
命令 说明 示例
创建库 新建数据库 CREATE DATABASE user_db;
切换库 选择操作库 USE user_db;
创建表(含复杂类型) 定义表结构:CREATE TABLE users (name STRING,friends ARRAY
2. 数据操作(DML)
命令 说明 示例
加载本地数据到Hive表 导入数据 LOAD DATA LOCAL INPATH ‘/data/users.txt’ INTO TABLE users;
查询数据 执行分析 SELECT name, address.city FROM users WHERE size(friends) > 10;
动态分区插入 按字段值自动分区 INSERT INTO page_view PARTITION (dt, country) SELECT url, dt, country FROM raw_log;
3. 元数据与运维
命令 说明 示例
查看表结构 显示字段和类型 DESCRIBE FORMATTED users;
修复分区 更新元数据分区信息 MSCK REPAIR TABLE page_view;
查看HDFS文件 直接操作HDFS dfs -ls /user/hive/warehouse/user_db;
三、典型示例场景
场景:分析网站日活用户(DAU)
创建分区表存储访问日志
CREATE TABLE user_access (
user_id INT,
access_time TIMESTAMP,
page_url STRING
) PARTITIONED BY (dt STRING); -- 按日期分区
加载日志数据到对应分区
LOAD DATA INPATH '/logs/20230621.log'
INTO TABLE user_access PARTITION (dt='20230621');
统计当日活跃用户数
SELECT dt, COUNT(DISTINCT user_id) AS dau
FROM user_access
WHERE dt = '20230621'
GROUP BY dt;
→ 输出结果:20230621 | 1543200
Elasticsearch(ES) 与 分库分表架构(如Cellars模式) 的核心区别
一、核心区别对比
维度 Elasticsearch(ES) 分库分表架构(如Cellars模式)
数据模型 文档型数据库(JSON格式),无固定模式(Schema-free) 关系型数据库(行/列结构),强模式约束
核心能力 全文搜索、实时分析、聚合计算 高并发事务处理、强一致性保证(ACID)
扩展方式 天然分布式,自动分片(Shard)与副本(Replica) 手动分库分表(如按用户ID分片),需应用层管理
索引机制 倒排索引(全文检索) + 列式存储(聚合分析) B+树索引(精确查询/范围查询)
一致性 最终一致性(写入延迟≈1秒) 强一致性(事务隔离)
二、主要用途
1. Elasticsearch(ES)
全文搜索:支持关键词、模糊匹配、语义分析(如电商商品搜索)
实时分析:日志聚合(ELK栈)、用户行为分析(如点击率统计)
非结构化数据处理:文本、日志、JSON文档的存储与检索
2. 分库分表架构(如Cellars模式)
高并发事务处理:支付订单、库存扣减(如电商交易系统)
结构化数据强一致性:银行转账、航班订票(需ACID事务)
水平扩展瓶颈突破:单表亿级数据拆分(如用户分库)
三、典型场景举例
案例1:电商平台
组件 ES的作用 分库分表的作用
商品搜索页 用户输入“夏季连衣裙” → 实时返回相关商品(全文检索 + 排序) ❌ 不适用
订单支付 ❌ 不适用 处理10万笔/秒的支付请求(分库分表分散负载)
案例2:日志监控系统
组件 ES的作用 分库分表的作用
错误日志分析 实时聚合服务器错误日志 → 生成TOP10错误类型报表 ❌ 不适用
用户操作审计 ❌ 不适用 存储用户操作记录(强一致性事务保障)
案例3:社交平台
组件 ES的作用 分库分表的作用
朋友圈全文搜索 搜索“去年旅行的照片” → 返回相关动态(语义匹配) ❌ 不适用
好友关系存储 ❌ 不适用 存储亿级用户关系(按用户ID分库)
⚠️ 四、选型建议
选择ES:需全文检索/实时分析 且 可接受最终一致性(如日志、商品搜索)
选择分库分表:需强一致性事务 且 高并发写入(如支付、库存系统)
互补方案:大型系统常组合使用——分库分表处理交易,ES提供搜索分析(如淘宝订单库 + 商品ES索引)
Groovy 中常用的 Java 语法和函数
一、基础语法兼容
变量定义与类型
// Java 风格(显式类型)
String name = "Groovy";
int count = 10;
// Groovy 风格(动态类型)
def dynamicVar = "Dynamic" // 类型自动推断
// Java 的 for 循环
for (int i = 0; i < 5; i++) {
println(i)
}
// Groovy 增强:范围迭代
(1..5).each { println(it) } // 闭包简化
二、常用 Java 函数/类
字符串处理
// Java 的 String 方法
def str = "Hello"
str.length() // Java 方法
str.toUpperCase() // 转为大写
// Groovy 扩展:GString
def name = "World"
println("Hello, ${name}!")
集合操作
// Java 的 ArrayList
List<String> list = new ArrayList<>()
list.add("A")
list.size()
// Groovy 简化语法
def groovyList = [“A”, “B”, “C”]
groovyList.each { println(it) } // 闭包遍历
文件读写
// Java 的 File 类
File file = new File("test.txt")
file.exists()
// Groovy 增强方法
def content = file.text // 直接读取文本
三、Groovy 特有增强
安全导航操作符
def obj = null
println(obj?.toString()) // 避免 NPE(Java 需判空)
Elvis 操作符
```groovy
def value = input ?: "default" // 等价于 Java 的三元表达式
闭包(替代函数式接口)
// Java 的 Runnable
new Thread(new Runnable() {
@Override
void run() {
println("Java thread")
}
}).start()
// Groovy 闭包简化
new Thread({ println("Groovy thread") }).start()
四、混合调用示例
// 调用 Java 的 Math 类
def sqrt = Math.sqrt(16) // 输出 4.0
// 调用 Java 的日期类(Groovy 扩展了简便方法)
def now = new Date()
println(now.format("yyyy-MM-dd")) // 输出格式化日期
关键区别总结
特性 Java Groovy
类型定义 必须显式声明(强类型) 支持 def 动态类型推断
集合操作 需手动迭代或 Stream API 内置 each/collect 等方法
空安全 需手动判空 支持 ?. 安全导航操作符
语法简洁性 代码冗余较多 闭包、运算符重载等简化语法
Groovy 完全兼容 Java 语法,同时通过动态特性和语法糖大幅提升开发效率,适合规则引擎(如 Jenkins Pipeline)、脚本编写等场景
CAT、Eagle(EMonitor)与 LogCenter:
一、核心定位与功能差异
系统 核心定位 主要用途 典型数据指标
CAT 分布式实时监控系统 应用层性能追踪:记录调用链路、异常诊断、服务拓扑可视化 调用耗时、错误率、JVM 状态
Eagle(EMonitor) 统一监控平台 全栈监控:覆盖系统/容器/中间件/业务层指标,支持海量数据存储与查询 CPU/内存、网络流量、业务 QPS
LogCenter 日志中枢系统(通用概念) 日志聚合分析:采集多源日志(网络设备/服务器/应用),实现故障定位与安全审计 日志格式解析、关键字告警、行为审计
二、主要用途详解
1. CAT(Central Application Tracking)
用途:
实时链路追踪:记录微服务调用路径(如订单创建涉及多少服务节点)
性能瓶颈分析:统计 SQL/RPC 调用耗时,定位慢查询(如支付接口超时问题)
异常告警:主动捕获代码异常(如空指针错误),推送至运维群
案例:
美团支付服务通过 CAT 发现某数据库节点响应延迟突增(耗时 >500ms),快速切换备用节点避免业务中断
2. Eagle(EMonitor)
用途:
资源监控:实时跟踪容器 CPU/内存使用率(如 Kubernetes 集群资源水位)
业务指标可视化:定制业务看板(如外卖日订单量趋势图)
多数据源支持:整合 Zabbix/Prometheus 等监控数据,统一展示
案例:
饿了么通过 EMonitor 检测到某区域 API 网关流量异常(较均值 +300%),及时扩容避免服务雪崩
3. LogCenter
用途:
日志集中管理:采集交换机/防火墙等设备日志,统一存储分析(如用户登录行为审计)
安全威胁检测:通过规则引擎识别攻击模式(如暴力破解登录)
故障回溯:关联多设备日志定位网络中断根因(如防火墙策略误阻断)
案例:
某企业通过 LogCenter 分析 H3C 交换机日志,发现端口频繁闪断(因网线接触不良),缩短排障时间 70%
三、技术架构对比
维度 CAT Eagle(EMonitor) LogCenter
数据处理 实时计算(秒级延迟) 近实时(分钟级聚合) 准实时(依赖采集频率)
存储规模 日处理 3200 亿+ 消息 日处理 PB 级数据 支持 TB 级日志存储
集成扩展性 多语言客户端(Java/Go/Python) 兼容开源监控工具(Zabbix 等) 支持 Syslog/API 等多协议接入
总结应用场景
选 CAT:需深度追踪微服务调用链,定位性能瓶颈(如电商交易系统)
选 Eagle:需统一监控混合架构(容器+物理机+业务指标),如云原生平台
选 LogCenter:需集中分析网络设备/安全日志,满足合规审计要求(如金融行业
一、数据仓库分层架构
数据仓库通常采用分层设计,每层职责明确,便于数据治理和复用。主流分层如下(不同企业可能有差异):
- 基础层(数据接入与原始存储)
STG(暂存层):
临时存储从业务系统抽取的原始数据,仅做基础清洗(如去重、格式校验),不保留历史。一般与源系统表结构一致。
ODS(操作数据存储层):
存储业务系统镜像数据,保留原始信息,支持增量/全量同步。表名常以 ods_ 开头(如 ods_order)。生命周期管理需明确(如日志类数据保留7天)。
2. 中间层(数据整合与模型化)
DWD(明细数据层):
对ODS数据清洗、标准化、维度退化,生成细粒度事实表(如订单明细)。表名示例:dwd_fact_order。此层需统一字段命名、处理空值。
DIM(公共维度层):
存储一致性维度表(如用户、商品维度),通过缓慢变化维(SCD)技术处理历史变更。表名前缀 dim_(如 dim_user)。
DWS(汇总数据层):
按主题域(如销售、用户)聚合指标,生成宽表供上层复用。表名如 dws_sales_daily。
3. 应用层(业务导向数据集市)
ADS/APP(应用数据层):
面向报表、API等具体场景,存放高度汇总或个性化指标。表名前缀 ads_ 或 app_(如 ads_user_retention)。
DM(数据集市):
部门级数据子集(如财务、营销数据集市),结构与DWS类似但更垂直。
✅ 分层核心价值:
解耦:层间依赖清晰(如ADS仅依赖DWS/DIM),变更影响可控。
复用:中间层模型减少重复计算(如DWS被多个ADS复用)。
效率:分层优化存储(ODS存原始,DWS存聚合,降低查询开销)。
二、数据库对象常用前缀规范
前缀用于快速识别对象类型,提升可维护性。常见前缀如下:
对象类型 常用前缀 示例 说明
表 tbl_ dim_ tbl_user_info 普通表
fact_ fact_sales 事实表
视图 v_ vw_ v_order_summary 简化复杂查询
存储过程 proc_ sp_ proc_calculate_bonus 处理业务逻辑
函数 func_ fn_ func_get_age 自定义计算
索引 idx_ idx_user_name 普通索引
pk_ pk_order_id 主键索引
fk_ fk_user_dept 外键索引
触发器 trig_ trig_update_log 自动化审计/逻辑
序列 seq_ seq_order_id 自增序列生成
表(Table)
前缀:tbl_(如 tbl_user)或直接业务缩写(如 order)。
规范:避免使用保留字,优先采用小写字母 。
2. 视图(View)
前缀:vw_(如 vw_order_summary)或 view_ 。
3. 索引(Index)
前缀:idx_(如 idx_user_id),主键索引可额外标注 pk_(如 pk_user)。
4. 存储过程(Stored Procedure)
前缀:sp_(系统存储过程)或 up_(自定义,如 up_insert_order)。
5. 触发器(Trigger)
前缀:tr_,后接操作类型(_I 插入、_D 删除、_U 更新),例如 tr_order_I 。
6. 约束与规则
主键约束:pk_(如 pk_product)。
外键约束:fk_(如 fk_order_user)。
检查约束:ck_(如 ck_age_positive)。
7. 自定义对象
函数:fn_(如 fn_calculate_total)。
序列:seq_(如 seq_order_id)
命名规范核心原则:
一致性:全库统一前缀风格(如全用小写 dim_ 或全大写 DIM_)。
描述性:前缀+业务含义(如 fact_sales 而非 tbl_01)。
长度控制:表/字段名 ≤ 30字符(部分数据库有长度限制)。
三、关键设计建议
数仓分层:
避免跨层引用(如DWD直接调ODS),确保数据血缘清晰。
维度层(DIM)独立建设,确保跨主题一致性。
前缀使用:
索引按类型+表名+字段命名(如 idx_user_name)。
禁用保留字(如 index、transaction),避免语法冲突
## 常用系统ß设置
打开系统偏好设置
点击屏幕左上角苹果菜单 > 系统偏好设置。
进入辅助功能
在偏好设置界面,点击 辅助功能 > 左侧选择 指针控制 > 右侧点击 触控板选项… 按钮5。
启用拖移功能
在弹出的窗口中:
✅ 勾选 启用拖移