V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
okcdz
V2EX  ›  程序员

自己做了一个轻量级的 NoSQL 数据库

  •  4
     
  •   okcdz · 6 天前 · 4195 次点击

    给大家介绍一个个人作品,叫 PoloDB,一个非常轻量级的 NoSQL 数据库,有着类似 MongoDB 的 API,主打几个特性:

    轻量级

    没有像 MySQL 那样的独立进程,它可以编译成静态库或者动态库,集成在你的应用里面,像 SQLite 一样。

    只需要很少资源就能够启动,不像 MongoDB,需要很强大的电脑,很适合分发到用户的设备上去。一般来说,用户的设备的配置不像服务器那么强大。比如你想在普通用户的 PC 甚至手机上运行一个重量级数据库,几乎不可能。如果一个客户端需要一个数据库,那么就需要这种轻量级的数据库。

    在磁盘上就只有一个文件,很容易传输、分发、备份。不需要再打包,导出。

    可移植性

    PoloDB 是用 Rust 写的,可以运行在大多数平台上。目前来说,我已经让它支持了 X86 上的 macOS,Linux 和 Windows 。之后,支持移动平台( iOS/Android )也在计划之中。像树莓派、龙芯、M1,应该也没问题。

    PoloDB 还支持非常丰富的语言绑定。C/C++ 和 Rust 可以直接使用。现在已经可以通过 Python 和 Node.js 来使用 PoloDB 了,适配层已经开发完。以后越来越多语言可以接入。

    灵活性

    NoSQL 数据库,可以像 MongoDB 一样使用,很灵活。数据操作读写都是通过 JSON,不需要创建 schema,打开数据库直接可以插入数据。

    现在的应用都迭代非常快,如果需要一种非常灵活,可以快速支持各种需求的数据库,像 PoloDB 这种 NoSQL 就很合适。

    功能齐全

    虽然说是轻量级的数据库,但是一个数据库该有的功能,PoloDB 也不会落下。比如说,现在已经支持原子提交(事务)。以后像数据索引这一类数据库该有的功能也会慢慢提供。之后通过拓展 API,会有越来越多的功能加进来,比如数据加密、数据备份、数据处理等等,有很大的想象空间。当然这些拓展功能都是可选的,因为要保持数据库本身是轻量级的。

    我现在看到很多人,很多应用喜欢把数据存到 JSON 文件里面。有了 PoloDB 之后,可能就会更加优雅。除了可以用上数据库的功能,也可以防止一下子把大量数据读到内存。因为 PoloDB 里面通过自身结构可以只读取你需要的那一部分数据,对性能大有益处。写入也是同理的。

    开源

    现在来说这是我的一个业余的个人项目,我都是用下班时间来写的。代码都开源在 Github 上面。大家喜欢的话,可以自行下载、review 里面的实现细节。我感觉 PoloDB 还是一个蛮有意思的项目,所以源码也和大家分享。最重要的,还是希望和大家交流。

    当然了,这是我几个月前开始开发的项目,现在还是一个很早期的阶段,但是也已经基本可以跑起来了。这个项目看起来很精简、很轻量,但是里面实现的细节并不简单。接下来还有非常多的工作要做,比如写一些解释它工作原理的文档,写很多严格的单元测试,给各种平台、语言做适配。欢迎大家试用,提 issue 和 MR 。

    Github 地址:https://github.com/vincentdchan/PoloDB

    44 条回复    2020-11-23 16:55:58 +08:00
    lzz2394677796
        1
    lzz2394677796   6 天前 via iPhone
    占位
    wertasy
        2
    wertasy   6 天前
    妙啊
    yangheng4922
        3
    yangheng4922   6 天前
    和 nedb 相比速度怎么样
    kwanzaa
        4
    kwanzaa   6 天前
    马克下 有空试试
    soli
        5
    soli   6 天前
    先 Star 了再说
    yangheng4922
        6
    yangheng4922   6 天前
    sunmoon1983
        7
    sunmoon1983   6 天前
    mark 有机会试下
    sinex
        8
    sinex   6 天前
    老哥, 我看了代码没找到 Write Ahead Log, 不做 WAL 不会不有丢数据的问题
    dreampet
        9
    dreampet   6 天前
    有没有和其他同类数据库的对比数据? Benchmark 什么的
    TaoQAQ
        10
    TaoQAQ   6 天前
    为什么要做这样的数据库?为了更快速的产出 MVP 功能?
    okcdz
        11
    okcdz   6 天前   ❤️ 1
    @sinex 有的,在 journal.rs 里面
    okcdz
        12
    okcdz   6 天前
    @yangheng4922 不好意思,因为你重复创建 collection 了,应该不允许这个操作,我晚点修复一下。

    第一次创建完,第二次可以用 db.colletion('students') 获取
    okcdz
        13
    okcdz   6 天前
    @yangheng4922 @dreampet 关于性能,等功能稳定之后,会做一次 benchmark,不过目前来说,性能不是首要目标
    ericgui
        14
    ericgui   6 天前
    这项目不错啊
    ashine
        15
    ashine   6 天前
    我大 PHP 这么没排面吗,居然没有支持计划。[手动狗头]
    yghack
        16
    yghack   6 天前
    Star
    okcdz
        17
    okcdz   6 天前
    @yangheng4922 刚刚推了一个 0.3.1 修复了这个问题,可以更新试试,感谢反馈
    okcdz
        18
    okcdz   6 天前
    @TaoQAQ 其实上面有写,一个是灵活性和快速迭代,一个是轻量级,占用少资源,还有移植性,主要针对客户端
    okcdz
        19
    okcdz   6 天前
    @ashine 哈哈哈,我 mark 一下。其实主要是后端都有大把成熟,好用的 db 了,我做这个主要给客户端用的。php 估计得靠后了。
    wongy
        20
    wongy   6 天前
    itcastcn
        21
    itcastcn   6 天前
    支持开源
    summerwar
        22
    summerwar   6 天前
    python 的 文档点进去 404 麻烦写个好测试
    VHacker1989
        23
    VHacker1989   6 天前
    既然针对客户端移植到安卓会有市场
    okcdz
        24
    okcdz   6 天前
    @summerwar 正在写,这两天内 push 上去
    okcdz
        25
    okcdz   6 天前
    @VHacker1989 在计划中了,只需要编译到 arm 然后写一个 java 或者 kotlin 转换层就可以跑了
    wzzzx
        26
    wzzzx   6 天前
    秒啊,期待楼主的文档哈哈哈哈
    b00tyhunt3r
        27
    b00tyhunt3r   6 天前
    支持

    想问下一般什么样的业务需要在客户端上安装一个小型数据库?
    way2explore2
        28
    way2explore2   6 天前
    我也一直想做一个 mongo lite db,但一直没开始动手做。:) 必须 mark
    kisshere
        29
    kisshere   6 天前
    没 PHP 你至少丢掉 80%的目标用户
    cmdOptionKana
        30
    cmdOptionKana   6 天前 via Android
    @b00tyhunt3r 很多,sqlite 就经常被嵌进客户端。比如词典、笔记类、日历、小游戏... 不是非得用数据库,但用了确实方便很多。
    AndyAO
        31
    AndyAO   6 天前
    对你的行为表示赞赏.
    yangheng4922
        32
    yangheng4922   6 天前
    https://s3.ax1x.com/2020/11/22/DGurOH.md.png
    还是有问题
    还有你说的重复创建的问题 `db.createCollection('students')` 好像执行了 createCollection 方法数据库里面有了这个集合重新运行代码的时候就会报错 说集合已存在 感觉这个机制有点怪怪的

    我全选的代码运行时正常的 重新运行一下就报错了
    `collection name 'students' already exists`
    yangheng4922
        33
    yangheng4922   6 天前
    全选 => 全新
    okcdz
        34
    okcdz   6 天前
    @yangheng4922 createCollection 这个函数用于创建集合,如果数据库已经存在了,应该用 .collection('students') 来获取,而不是 createCollection

    我猜你之前的 db 可能已经因为之前的 bug 有点问题了,删了重新运行一下呢?

    不过我猜你想要的是不用 create,直接用 .collection 就可以插入的那种

    我们移步 Github issue 讨论?
    xuewuchen
        35
    xuewuchen   5 天前
    呃~~mysql ,firebird ,sqlite,access....
    hbolive
        36
    hbolive   5 天前
    先支持了再说!
    ETO
        37
    ETO   5 天前
    @ashine 如果你写 PHP,你会用吗?:)
    wwatson
        38
    wwatson   5 天前
    @kisshere 客户端很少用 PHP 吧
    KleinP
        39
    KleinP   5 天前
    为什么没有 C#,这么没牌面的吗
    tikazyq
        40
    tikazyq   5 天前
    感觉很棒啊!
    llsquaer
        41
    llsquaer   5 天前
    最近也是在找类似的裤子 ... 先支持..
    mlxj
        42
    mlxj   5 天前
    可以
    abersheeran
        43
    abersheeran   5 天前
    好东西!已经 Star 。
    2han9wen71an
        44
    2han9wen71an   5 天前
    先给个 star
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2202 人在线   最高记录 5268   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 16:32 · PVG 00:32 · LAX 08:32 · JFK 11:32
    ♥ Do have faith in what you're doing.