使用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 相关文章推荐
不使用中间变量,交换int型的 a, b两个变量的值。
Oct 29 Javascript
jQuery模拟原生态App上拉刷新下拉加载更多页面及原理
Aug 10 Javascript
AngularJS用户选择器指令实例分析
Nov 04 Javascript
用Vue.js实现监听属性的变化
Nov 17 Javascript
JS实现图片预加载之无序预加载功能代码
May 12 Javascript
javascript 中iframe高度自适应(同域)实例详解
May 16 Javascript
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
Sep 19 Javascript
vue bus全局事件中心简单Demo详解
Feb 26 Javascript
详解Vue webapp项目通过HBulider打包原生APP
Jun 29 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
Jul 11 jQuery
vue实现拖拽进度条
Mar 01 Vue.js
Ajax异步刷新功能及简单案例
Nov 20 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自动反斜杠的函数代码
2010/01/05 PHP
php语言流程控制中的主动与被动
2012/11/05 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
javascript工厂模式和构造函数模式创建对象方法解析
2016/12/30 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
使用use注册Vue全局组件和全局指令的方法
2018/03/08 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
2018/09/05 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
2018/12/28 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
详解JavaScript修改注册表的方法
2020/01/05 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
[06:04]DOTA2英雄梦之声Vol19卓尔游侠
2014/06/20 DOTA
[55:44]OG vs NAVI 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
替换python字典中的key值方法
2018/07/06 Python
浅析pandas 数据结构中的DataFrame
2019/10/12 Python
python 使用pygame工具包实现贪吃蛇游戏(多彩版)
2019/10/30 Python
python内打印变量之%和f的实例
2020/02/19 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
澳大利亚牛仔裤商店:Just Jeans
2016/10/13 全球购物
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
高三自我鉴定
2013/10/23 职场文书
市场营销个人求职信范文
2014/02/02 职场文书
银行职员个人的工作自我评价
2014/02/15 职场文书
党员承诺书怎么写
2014/05/20 职场文书
节约用水标语
2014/06/11 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
2014年标准化工作总结
2014/12/17 职场文书
大学感恩节活动总结
2015/05/05 职场文书
2015暑假社会调查报告
2015/07/13 职场文书
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL