Skip to content

数据库的选择

数据库的选择是系统设计的关键决策,直接影响性能、扩展性和开发效率。以下是主流数据库类型的详细解析:


关系型数据库(如 MySQL、PostgreSQL)

一、是什么?
基于关系模型,以二维表格(行+列)存储数据,支持 SQL 语言操作,通过外键建立表间关联。

二、解决什么问题

  1. 保证数据的强一致性(ACID 事务)
  2. 处理复杂的关联查询(如 JOIN 操作)
  3. 适用于需要严格数据完整性的场景

三、应用场景

  • 金融系统(银行交易)
  • ERP/CRM 系统(客户关系管理)
  • 需要复杂查询的业务(如电商订单管理)

四、Java 示例(Spring Data JPA)

java
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    // Getters & Setters
}

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.name = :name")
    List<User> findByName(@Param("name") String name);
}

五、注意事项

  • 水平扩展困难(分库分表复杂)
  • 固定表结构,修改成本高
  • 高并发写入可能成为瓶颈

文档数据库(如 MongoDB)

一、是什么?
以 JSON/BSON 格式存储文档(Document),每个文档可独立存储不同结构的数据。

二、解决什么问题

  1. 处理半结构化/无模式数据
  2. 实现水平扩展(天然分布式设计)
  3. 快速迭代开发(无需预定义 schema)

三、应用场景

  • 内容管理系统(CMS)
  • 实时分析(如用户行为日志)
  • IoT 设备数据存储

四、Java 示例(Spring Data MongoDB)

java
@Document
public class Product {
    @Id
    private String id;
    private String name;
    private Map<String, Object> attributes; // 动态字段
}

public interface ProductRepository extends MongoRepository<Product, String> {
    List<Product> findByName(String name);
}

五、注意事项

  • 不支持跨文档事务(4.0+ 支持有限事务)
  • 关联查询能力较弱
  • 内存消耗较大

键值数据库(如 Redis)

一、是什么?
通过 Key-Value 对存储数据,Value 支持多种数据结构(字符串/哈希/列表等)。

二、解决什么问题

  1. 实现超高读写性能(内存存储)
  2. 解决瞬时高并发访问问题
  3. 分布式锁等中间件需求

三、应用场景

  • 缓存层(减轻数据库压力)
  • 会话存储(Session)
  • 实时排行榜(SortedSet)

四、Java 示例(Lettuce 客户端)

java
RedisClient client = RedisClient.create("redis://localhost");
StatefulRedisConnection<String, String> connection = client.connect();
RedisCommands<String, String> commands = connection.sync();

// 存储用户会话
commands.set("session:user123", "{'name':'John', 'role':'admin'}");

// 使用Java8 Duration设置过期时间
commands.expire("session:user123", Duration.ofMinutes(30));

五、注意事项

  • 数据量受内存限制
  • 持久化可能丢数据(取决于配置)
  • 不适合复杂查询

列式数据库(如 Cassandra)

一、是什么?
按列族(Column Family)存储数据,擅长分布式处理和超大规模数据。

二、解决什么问题

  1. 海量数据水平扩展
  2. 高写入吞吐量(日志型数据)
  3. 多数据中心部署

三、应用场景

  • 物联网传感器数据
  • 时序数据(如监控指标)
  • 消息日志存储

四、Java 示例

java
Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").build();
Session session = cluster.connect("my_keyspace");

// 使用PreparedStatement(避免SQL注入)
PreparedStatement ps = session.prepare(
    "INSERT INTO sensor_data (sensor_id, timestamp, value) VALUES (?, ?, ?)");

BoundStatement bs = ps.bind("sensor-001", Instant.now(), 23.5);
session.execute(bs);

五、注意事项

  • 查询模式需预先设计
  • 最终一致性模型
  • 不支持复杂事务

核心区别对比

特性关系型文档型键值对列式存储
数据模型表格+关联JSON文档Key-Value列族
扩展方式垂直/分库水平水平水平
事务支持ACID有限
读写性能中等读优极高写优
典型场景金融交易内容管理缓存物联网数据

选择策略总结

  1. 强事务需求 → 关系型数据库
  2. 灵活数据结构 → 文档数据库
  3. 超高并发读取 → Redis + 关系型组合
  4. 海量数据写入 → 列式数据库
  5. 复杂关联分析 → 关系型 + 数仓(如ClickHouse)

JDK8+ 提示

  • 使用 java.time.Instant 处理时间(兼容数据库时间戳)
  • 通过 CompletableFuture 实现异步数据库操作
  • 结合 Stream API 处理查询结果集:
java
List<String> names = userRepository.findAll()
    .stream()
    .filter(u -> u.getAge() > 18)
    .map(User::getName)
    .collect(Collectors.toList());

最终建议

  • 初创项目首选 PostgreSQL(平衡关系型与JSON支持)
  • 高并发场景用 MySQL + Redis 组合
  • 超大数据量考虑 Cassandra 或 ScyllaDB
  • 优先托管服务(如 AWS RDS/Aurora)降低运维成本