当前位置:首页 > 日记 > 正文

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

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

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

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

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

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

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

如下图

  现在想用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的一种思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

相关文章

painter怎么绘制丛林树枝外观效果

painter怎么绘制丛林树枝外观效果

图形,绘制,树枝,丛林,外观,Painter中想要绘制一个松树枝,该怎么制作呢?下面我们就来看看使用painter绘制的方法。软件名称:Corel Painter(绘画软件) 2018 官方正式版(附注册机) 在线安装包 64位软件大小:994KB更新时间:2017-06-301、打开Painter…

Photoshop制作丛林蟒蛇缠绕啤酒魔

Photoshop制作丛林蟒蛇缠绕啤酒魔

蟒蛇,丛林,海报,风格,电脑软件,有一些小伙伴问我这个是怎么做出来的,所以发出来分享一下!我自己也还在学习当中,有些不好的地方请大家多多提点。最终效果 寻找一些素材。一、搭建场景。二、调色与混合模式。 三、酒瓶的调整。12 3 阅读全文四…

ps怎么设计动漫人物水彩画?

ps怎么设计动漫人物水彩画?

水彩画,动漫人物,电脑软件,ps,利用ps制作动漫人物水彩画效果,主要利用了滤镜里的艺术效果,现在就把制作的步骤和截图分享出来,希望对你有所帮助,同时也希望本经验能够起到抛砖引玉的作用。软件名称:Photoshop CS5 绿色版官方中文正式原版软件大…

photoshop打造镀金十足的立体文字

photoshop打造镀金十足的立体文字

文字特效,电脑软件,photoshop,今天小编为大家分享photoshop打造镀金十足的立体文字特效方法,教程比较基础,制作出来的文字非常漂亮,推荐到,一起来看看吧!最终效果图:步骤:1、新建一个画布800x800,背景填充为白色2、输入文字(IOU),字体udy Stout,加粗…

wps无法显示

wps无法显示

无法显示,电脑软件,wps,金山WPS是一款国产免费而又功能强大的办公软件,它完全可以替代微软OFFICE,但是也难免有一些小的问题,比如:在编写带图片的文档时,会发现有时候图片插入文档的某一位置的时候,图片不能完全显示,那么wps文档插入图片显示不全…

Excel剪贴板数据与选定区域的大小

Excel剪贴板数据与选定区域的大小

数据,剪贴板,区域,形状,大小,在Excel2007中,如果想复制某一个行或列,在新的文件或行、列中粘贴,那么系统会提示“剪贴板数据与选定区域的大小形状不同,仍要粘贴吗?”如果要复制粘贴很多行和列,那每次都有提示,都要点击一次“确定&…

word背景怎么设置

word背景怎么设置

设置,背景,电脑软件,word,一个漂亮的word文档不可缺少背景,那么怎么设置word的背景呢,下面小编给大家详细介绍word背景图片怎么设置。设置步骤:在word菜单栏中找到“格式”——背景——填充效果,在填充效果中切…

win2003+iis6服务器设置排错集锦

win2003+iis6服务器设置排错集锦

排错,服务器设置,集锦,电脑软件,很多朋友在用IIS6架网站的时候遇到不少问题, 以下是在所知的2003iis碰见的一些问题,只要对着症状处理。服务器一定可以使用的。问题1:未启用父路径症状举例:Server.MapPath() 错误 'ASP 0175 : 80004005' 不允…

win10创建系统还原点

win10创建系统还原点

系统还原,电脑软件,本文中,我们所要介绍的是通过快捷方式创建Windows 10系统还原点。检查「系统保护」功能是否已启用在正式操作之前,请先确保你的 Windows 10 已经启用了系统还原点功能:1. 在「运行」中执行 systempropertiesprotection &…

Asp DatePart 函数的语法详解 | 用

Asp DatePart 函数的语法详解 | 用

用于,函数,语法,时间间隔,日期,DatePart 的语法是 DatePart(interval, date),用以取 date 的某部分。 interval yyyy:date 中的年 m:date 中的月 d:date 中的日 h:date 中的时 n:date 中的分 s:date 中的秒 q:date 位于该年的第几季度,比如 2009-6-2…

apache安装了无法启动怎么办?

apache安装了无法启动怎么办?

无法启动,安装了,电脑软件,apache,有的网友问小编,我安装了apache可是无法启动怎么办呢?重新卸载了再重新安装还是无法启动?答:由于小编也不太懂apache,从网上搜集了几个可能原因,您一一尝试一下吧,希望对您有帮助。第一种可能原因,可能80端口被占…

php7基于递归实现删除空文件夹的方

php7基于递归实现删除空文件夹的方

方法,递归实现,删除,示例,电脑软件,本文实例讲述了php7基于递归实现删除空文件夹的方法。分享给大家供大家参考,具体如下:php版本7.0.4代码如下:<?php$path = 'd:/';rmDir_1($path);function rmDir_1($path) { $files = scandir($path);//…