使用Node.js实现ORM的一种思路详解(图文)


Posted in Javascript onOctober 24, 2017

ORM是O和R的映射。O代表面向对象,R代表关系型数据库。二者有相似之处同时也各有特色。就是因为这种即是又非的情况,才需要做映射的。

理想情况是,根据关系型数据库(含业务需求)的特点来设计数据库。同时根据面向对象(含业务需求)的特点来设计模型(实体类)。然后再去考虑如何做映射。但是理想很骨jian感dan,现实太丰fu满za。

没见哪个ORM是这么做的,也没见哪位高手会这么做设计。那么实际情况是什么样子的呢?以.net的Entity Framework为例。

DB frist,就是先设计好数据库,然后根据库里的表、主外键等自动创建实体类。然后可以通过LinQToSQL来操作。这样创建出来的实体类显然缺乏面对对象的特色。

Code frist,就是先设计实体类,然后根据实体类和特性来自动创建表和主外键、约束等。而为了严谨,定义实体类的时候需要说明一下主外键等具有关系型特色的东东。

如下图

使用Node.js实现ORM的一种思路详解(图文)

现在想用node来做一套引擎。刚刚接触node,估计会有现成的orm吧,不知道他们是怎么做的,先不管他们了,先把自己的思路弄清楚再说,恩恩。

为啥要选择node呢?以为他原生支持json。Json在前端那是主场,js原生支持json,各种操作都非常流畅舒服。但是json到了后端(C#)就麻烦了,C#原生不支持json,只能作为字符串,或者实体类序列化的形态。这就需要转来转去的,很是麻烦。

而采用node那么后端也可以用js来编码,也就是说会原生支持json。这就舒服多了。想想,前端创建json(实体类),然后整个提交给后端,后端接到json直接进行处理(安全验证、业务处理),然后直接持久化。是不是很爽!

采用node还有一个好处,那就是他可以在运行时定义实体类的属性,比如增加属性。这个在C#里是无法实现的。

为啥一定要运行时可以修改实体类?因为这样做可以避免实体类数量爆炸。

打开你的项目,数一数定义了多少的实体类?是不是项目越大实体类就越多?当需要发生变化,需要给实体类增加一个属性的时候,是不是需要各种改代码?虽然VS可以帮我们做很多工作。

所以说还是在运行时可以随意修改实体类的好,这样可以极大地避免修改代码的问题。(因为根本就没有啥代码)

这一篇主要是说思路,所以先简单设计一个json来表示一下。

设计这个json的目的是,引擎可以根据json的情况来拼接成SQL,然后交给数据库处理。

{
 "operationMode":"add",// add\update\delete\select
 "tableCount":1, //支持多表的级联添加、修改
 "fieldInfo":[{//主表的字段,参与操作的字段,不参与的不用写。第一个字段是主键(不支持多主键)
 "tableName": "t1", //表名。
 "primaryKey":"id",//主键字段名。我不想把主键字段名限制为必须是“ID”
 "_sqlCache": "" ,//缓存的sql语句,每次都拼接sql也挺烦的,弄个缓存存放拼接好的sql。
 "fieldList":{ //涉及到的字段,并不需要把表里的字段都放进来,根据业务需求设计
   //客户端提交的json与之对应
 "field1Name":"field1Value",
 "field2Name":"field2Value"
 }
 },
 { //从表的字段,可以不设置
 "primaryKey": "id", //主键字段名。我不想把主键字段名限制为必须是“ID”
 "foreignKey": "foreignKeyid", //主键字段名。我不想把主键字段名限制为必须是“ID”
 "_sqlCache": "", //缓存的sql语句,每次都拼接sql也挺烦的,弄个缓存存放拼接好的sql。
 "fieldList": { //涉及到的字段(不含外键字段),并不需要把表里的字段都放进来,根据业务需求设计
   //客户端提交的json与之对应
 "field1Name": "field1Value",
 "field2Name": "field2Value"
 }
 } // 从表的字段,参与操作的字段,不参与的不用写。第一个字段是主键,第二个字段是外键
 ],
 "findCol":[{
 "colName":"col1",
 "key1":"abc",
 "key2":"abc", //范围查询时使用,比如从几号到几号
 "findKind":" {colName} like {key}" //查询方式:like、not Like、in、=、between等
 }]
}

一般的ORM是以实体类为核心,要求实体类的完整,就说一个实体类要和一个完整的表做映射。比如要下架一个商品,一般的做法是先把这个商品从数据库里读取出来实例化之后,修改标记属性(字段),然后再把整个实体类持久化(保存到数据库)。

但是SQL怎么写呢?一个update就可以了,不用读取数据的,这样效率就有点损耗。

那么如果要把一个分类的商品都下架呢?要把这个分类里的商品都折腾出来,然后批量改属性值,在批量持久化。

如果写SQL语句呢?还是那一句SQL,只不过是把查询条件换一下,还是不需要折腾数据。这种情况下效率的差别就很大了。

而我的这个思路呢,并不是以面向对象为核心的,而是以关系型数据库为核心。

就是说不会把实体类和表做整体的映射,而是会把属性和字段做映射。就是说把一个表里的部分字段拿出来,做成一个实体类,然后进行操作。比如下架商品的例子

表:商品表

字段:isxiajia = 1

条件:id=1(单商品下架)  cate=2 (按照分类下架)

然后生成update语句就可以了。

这是一个独立的“实体类”,这个类里面并不需要商品的其他属性,因为只是下架操作。另外查询条件也完全放开,不是仅仅依据ID查询,还可以按照其他字段来查询,比如分类字段。这样效率就可以得到提升。

总结

 以上所述是小编给大家介绍的使用Node.js实现ORM的一种思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js中unicode转码方法详解
Oct 09 Javascript
JSONP基础知识详解
Mar 19 Javascript
原生JS+Canvas实现五子棋游戏实例
Jun 19 Javascript
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
Jan 08 jQuery
vue-cli项目根据线上环境分别打出测试包和生产包
May 23 Javascript
jQuery动态移除与增加onclick属性的方法详解
Jun 07 jQuery
webpack4 从零学习常用配置(小结)
May 28 Javascript
微信小程序实现分享商品海报功能
Sep 30 Javascript
基于vue+echarts 数据可视化大屏展示的方法示例
Mar 09 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
May 15 Javascript
VUE中V-IF条件判断改变元素的样式操作
Aug 09 Javascript
微信小程序实现弹幕墙(祝福墙)
Nov 18 Javascript
分享vue.js devtools遇到一系列问题
Oct 24 #Javascript
详解基于 Nuxt 的 Vue.js 服务端渲染实践
Oct 24 #Javascript
Vue基于NUXT的SSR详解
Oct 24 #Javascript
nuxt+axios解决前后端分离SSR的示例代码
Oct 24 #Javascript
使用js获取伪元素的content实例
Oct 24 #Javascript
原生JS实现Ajax跨域请求flask响应内容
Oct 24 #Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
Oct 24 #Javascript
You might like
[转帖]PHP世纪万年历
2006/12/06 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
php图形jpgraph操作实例分析
2017/02/22 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
Laravel框架处理用户的请求操作详解
2019/12/20 PHP
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
js实现照片墙功能实例
2015/02/05 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
JavaScript中为事件指定处理程序的五种方式分析
2018/07/27 Javascript
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
Python做简单的字符串匹配详解
2017/03/21 Python
Django使用详解:ORM 的反向查找(related_name)
2018/05/30 Python
python模块导入的细节详解
2018/12/10 Python
python学习——内置函数、数据结构、标准库的技巧(推荐)
2019/04/18 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
Python 合并拼接字符串的方法
2020/07/28 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
CSS3实现圆角、阴影、透明效果并兼容各大浏览器
2014/08/08 HTML / CSS
Mybag美国/加拿大:英国奢华包包和名牌手袋网站
2020/02/16 全球购物
工业自动化专业毕业生推荐信
2013/11/18 职场文书
二年级评语大全
2014/04/23 职场文书
2016三八妇女节校园广播稿
2015/12/17 职场文书
委托书范本格式
2019/04/18 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
使用Springboot实现健身房管理系统
2021/07/01 Java/Android
Minikube搭建Kubernetes集群
2022/03/31 Servers