likes
comments
collection
share

数据库我是这样写出来的,Java版本1,持续更新

作者站长头像
站长
· 阅读数 24

了解数据库的内部原理其实很不容易,大部分的读写都停留在理论文章上,因此肖哥带着大家使用Java手写一个完整的数据库,让大家了解数据库的解析器、性能分析器、认证、查询优化器,执行引擎、存储引擎、事务管理、MVCC,数据恢复等一系列功能。这个工作量比较大,属于每日1-2更新,大家如果想了解数据库的内容原理,掌握数据库的核心技术,那么可以跟着肖哥的步骤一步一步的学习。数据库会包含大家熟悉的数据结构与算法例如 B+树索引R树索引 等,仅数据存储就包含了数据块(Chunks)、文件头(File Header)、键值存储(MVMap)、并发控制、事务、序列化与反序列化、压缩、加密、索引、持久化存储、内存映射存储、分片机制、以及计划中的压缩和碎片整理等能力。

公号Solomon肖哥弹架构获取更多精彩内容 ,需要完整代码的可以留言

手写数据库持续更新系列 ,喜欢的读者 , 一定要订阅哦

欢迎 点赞,收藏,关注 。

完整的数据库具备能力图:

数据库我是这样写出来的,Java版本1,持续更新

手写计划

  1. 小白能够看得懂的最简化版本数据库
  2. 标准SQL解析器
  3. 存储引擎
  4. 执行引擎
  5. 事务管理
  6. 日志系统
  7. 元数据管理
  8. 安全管理
  9. 性能分析器
  10. 网络版
  11. 标准JDBC接口对接

整体手写系列的大模块会包含以上功能。

小白版本1

实现了对SQL语句的解析,支持基本的CREATE TABLEINSERT INTOSELECT语句,并使用简单的词法和语法分析。:

import java.util.*;
import java.util.stream.Collectors;

class SQLDatabase {
    private Map<String, List<List<String>>> tableData = new HashMap<>();

    // 创建表
    public void createTable(String tableName) {
        tableData.putIfAbsent(tableName, new ArrayList<>());
    }

    // 插入数据
    public void insertInto(String tableName, List<String> rowData) {
        tableData.get(tableName).add(rowData);
    }

    // 执行SELECT查询
    public List<List<String>> select(String tableName, String... conditions) {
        List<List<String>> result = new ArrayList<>(tableData.get(tableName));
        for (int i = 0; i < conditions.length; i += 2) {
            String column = conditions[i];
            String value = conditions[i + 1];
            result.removeIf(row -> !row.contains(value) || !row.get(0).equals(column));
        }
        return result;
    }

    // 简单的词法分析器
    private List<String> tokenize(String input) {
        return Arrays.asList(input.split("\s+"));
    }

    // 简单的SQL解析器
    public void executeSQL(String sql) {
        List<String> tokens = tokenize(sql);
        String command = tokens.get(0).toUpperCase();

        switch (command) {
            case "CREATE":
                if (tokens.size() >= 3 && "TABLE".equals(tokens.get(1))) {
                    String tableName = tokens.get(2);
                    createTable(tableName);
                    System.out.println("Table '" + tableName + "' created.");
                }
                break;
            case "INSERT":
                if (tokens.size() >= 3 && "INTO".equals(tokens.get(1))) {
                    String tableName = tokens.get(2);
                    List<String> rowData = new ArrayList<>();
                    for (int i = 3; i < tokens.size(); i++) {
                        rowData.add(tokens.get(i));
                    }
                    insertInto(tableName, rowData);
                    System.out.println("Data inserted into '" + tableName + "'.");
                }
                break;
            case "SELECT":
                if (tokens.size() > 2 && "FROM".equals(tokens.get(1))) {
                    String tableName = tokens.get(2);
                    List<List<String>> selectedData = select(tableName, new String[tokens.size() - 3]);
                    for (List<String> row : selectedData) {
                        System.out.println(row);
                    }
                }
                break;
            default:
                System.out.println("Unsupported command.");
                break;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        SQLDatabase db = new SQLDatabase();

        // 执行SQL语句
        db.executeSQL("CREATE TABLE users");
        db.executeSQL("INSERT INTO users Alice 25");
        db.executeSQL("INSERT INTO users Bob 30");
        db.executeSQL("SELECT FROM users Alice");

        // 执行更复杂的SELECT语句
        db.executeSQL("SELECT Alice FROM users WHERE 25");
    }
}
此版本实现了以下功能:
  • createTable:创建一个新的表。
  • insertInto:向表中插入一行数据。
  • select:执行一个简单的SELECT查询,支持基于列名和值的条件过滤。
  • tokenize:一个简单的词法分析器,将SQL语句分割成单词列表。
  • executeSQL:根据词法分析的结果,解析并执行SQL命令。

总结

案例非常简化,不支持完整的SQL语法,也没有实现数据持久化、事务、并发控制、索引等数据库系统的关键特性。此外,它仅支持字符串类型的数据和简单的条件查询。 此案例为了让大家有一个初步了解。后续会一步一步复杂化与标准化。

转载自:https://juejin.cn/post/7386585637351604261
评论
请登录