如题,最近业余写一个 TypeSciprt 小玩具,需要用 ORM 来加速我的进度,感觉目前 NodeJs 可选的 ORM 都不太理想,于是自己动手写了一个,开源出来。
为了让这个框架看上去像模像样,我还做出了一些额外的努力,虽然不知道有啥用,但试试写一个正常项目的感觉吧。
- 做了一个网站 :https://oor.xdnote.com ,写了很多文档.
- 英文优先,所有注释都用英文来写,README.md 也是优先英文.
- 花了很多时间写单元测试,核心逻辑全覆盖。
想了解可去看下 说明文档, 源码在 Githhub ,支持给个 Star 就好。
为什么要自己弄一个ORM
以前也用过不少 ORM 框架,主要有以下问题
- 大多比较麻烦,尤其是 Java ,XML,Entity, Mapper,DAO , 一大堆玩意,改个字段都会让写代码的心情不好。
- 文档太复杂,一个框架里面有几十页的文档,用起来都不敢不看。(oor 的文档就三页,半小时全部看完)
- 提供了太多 屠龙之术 ,虽然强大,但 80% 的高级内容,可能 80% 的人并不需要。
- 性能低下,一些 ORM 内部验证,处理,转换,效率太低,浪费计算资源。
- 认知负担重,部分 ORM 框架为了彰显 强大,还出自己专用的语法库等。
正因为上面一些原因,一直有一派,坚持不使用 ORM ,只用 SQL, 代价就是写起来慢点,获得查询性能的一些提升。
ORM 为什么慢
- ORM 需要构造对象,比如在 MyBatis 里面,就用到很多反射,序列化,注入等。
- ORM 需要将 API 的入参,最终转换成 SQL, 转换效率各有不同。
- ORM 需要考虑各种兼容性,横向的有几十种数据库,纵向需要有 CRUD, JOIN, 一对多,多对多各种结构,事务管理等,内部非常复杂。
其实我们用的数据库,也就那么一两个,而使用的方法,大部分都是一些基础操作。
实际上见过这么多项目能用上 ORM 高级特性的寥寥无几,真用的时候,还是通过手动档来实现。
能提升吗
这也是我写 oor
的理由,目前通过两方面来保障计算量最小化:
- 只支持
PostgreSql
,Elastic Search
,MySql
!- 只支持 CRUD, 对于标准ORM 声称的 “标准特性” 直接抛弃
人个认为 : ORM 只提供基础功能,性能要快,省下80%的重复劳动就行,剩下20%请开发人员自己动手
需要做到:
- 性能必须要快 - 方便单元测试,降低资源消耗
- API必须要简单 - 不看文档,能看得懂英语就行
还有一些业务上理由
平时做项目时,经常遇到一些 “非标准” 的需求:
- 数据表里面有
create_time
,last_update_time
这样的字段,插入修改数据时自动给值 - 数据表里面有
status
这样的字段,删除时,要使用 update state=999, 不能真删 - 数据表里面有
org
这样的字段,查询时数据不能查询本 org 之外的数据 - 甲方安全意识强,且“学识丰富”,极其苛刻的XSS(特殊字符校验)需求。
像这样的需求,标准 ORM 肯定不会提供,只会提供一些标准接口,自己写逻辑,如果用的少还可以写下,用的多了,代码也不美观。
oor
支持(或添加式扩展)这些功能,保护代码的易阅读性,不需要再为这些 “奇怪的” 设定而伤脑筋降低开发人员的认知负担,减少出错率。
由于基本不考虑兼容性,目前代码的转换性能消耗约可以忽略不计!
Elastic Search
可以骄傲的说,这一点是其它任何 ORM 框架都没有的, OOR
支持 Elastic Search
!
API 与 PG 完全一模一样,无入门门槛使用 Elastic Search
的 CRUD 功能!
另外可以骄傲说的一个点:本 ORM 使用起来也最现在所有 ORM 框架中最简单的,没有之一!可以极大程度的省掉你的时间,和代码行数!
再次求 Star
第一次把项目做的有模有样的冲动,如果支持可以给我个 Star,谢谢!