自己做了一个轻量级的 NoSQL 数据库 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
okcdz
V2EX    程序员

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

  •  4
     
  •   okcdz 2020-11-22 09:55:18 +08:00 7556 次点击
    这是一个创建于 1783 天前的主题,其中的信息可能已经有所发展或是发生改变。

    给大家介绍一个个人作品,叫 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  
       2020-11-22 10:02:18 +08:00 via iPhone
    占位
    wertasy
        2
    wertasy  
       2020-11-22 10:09:19 +08:00
    妙啊
    yangheng4922
        3
    yangheng4922  
       2020-11-22 10:15:48 +08:00
    和 nedb 相比速度怎么样
    kwanzaa
        4
    kwanzaa  
       2020-11-22 10:24:03 +08:00
    马克下 有空试试
    soli
        5
    soli  
       2020-11-22 10:31:09 +08:00
    先 Star 了再说
    yangheng4922
        6
    yangheng4922  
       2020-11-22 10:40:10 +08:00
    sunmoon1983
        7
    sunmoon1983  
       2020-11-22 10:52:58 +08:00
    mark 有机会试下
    sinex
        8
    sinex  
       2020-11-22 10:59:34 +08:00
    老哥, 我看了代码没找到 Write Ahead Log, 不做 WAL 不会不有丢数据的问题
    dreampet
        9
    dreampet  
       2020-11-22 11:00:36 +08:00
    有没有和其他同类数据库的对比数据? Benchmark 什么的
    TaoQAQ
        10
    TaoQAQ  
       2020-11-22 11:11:52 +08:00
    为什么要做这样的数据库?为了更快速的产出 MVP 功能?
    okcdz
        11
    okcdz  
    OP
       2020-11-22 11:27:37 +08:00   1
    @sinex 有的,在 journal.rs 里面
    okcdz
        12
    okcdz  
    OP
       2020-11-22 11:29:30 +08:00
    @yangheng4922 不好意思,因为你重复创建 collection 了,应该不允许这个操作,我晚点修复一下。

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

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

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

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

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

    我们移步 Github issue 讨论?
    xuewuchen
        35
    xuewuchen  
       2020-11-23 09:13:39 +08:00
    呃~~mysql ,firebird ,sqlite,access....
    hbolive
        36
    hbolive  
       2020-11-23 09:16:53 +08:00
    先支持了再说!
    ETO
        37
    ETO  
       2020-11-23 09:19:05 +08:00
    @ashine 如果你写 PHP,你会用吗?:)
    wwatson
        38
    wwatson  
       2020-11-23 09:29:29 +08:00
    @kisshere 客户端很少用 PHP 吧
    KleinP
        39
    KleinP  
       2020-11-23 09:38:47 +08:00
    为什么没有 C#,这么没牌面的吗
    tikazyq
        40
    tikazyq  
       2020-11-23 10:14:53 +08:00
    感觉很棒啊!
    llsquaer
        41
    llsquaer  
       2020-11-23 10:44:17 +08:00
    最近也是在找类似的裤子 ... 先支持..
    mlxj
        42
    mlxj  
       2020-11-23 11:30:45 +08:00
    可以
    abersheeran
        43
    abersheeran  
       2020-11-23 14:27:13 +08:00
    好东西!已经 Star 。
    2han9wen71an
        44
    2han9wen71an  
       2020-11-23 16:55:58 +08:00
    先给个 star
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     935 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 22:20 PVG 06:20 LAX 15:20 JFK 18:20
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86