ORM是O和r的映射,O代表面向对象,r代表关系数据库。他们之间有相似之处,也有不同之处。正是因为这种情况,映射是必要的。
理想情况下,应该根据关系数据库的特性(包括业务需求)来设计数据库。同时,根据面向对象(包括业务需求)的特点,设计了模型(实体类)。然后考虑如何做映射。但理想很骨的简丹,现实太富富满咱。
我没有见过任何ORM做这个,也没有见过任何大师做这个设计。那么实际情况是怎样的呢?以的实体框架为例。net为例。
数据库首先是设计数据库,然后根据数据库中的表和主键、外键自动创建实体类。然后可以通过LinQToSQL进行操作。这样创建的实体类明显缺乏面向对象的特性。
代码优先意味着首先设计实体类,然后自动创建表、主外键和次外键、约束等。根据实体类别和特征。为了严谨起见,在定义实体类时,有必要解释具有关系特征的东西,比如主键和外键。
下图
现在我想用node作为引擎。我想我刚接触到node,就有现成的orm了。我不知道他们是怎么做到的。让我们离他们远点。先理清自己的思路。嗯嗯。
为什么选择node?以为他天生支持json。Json是前端的家,js原生支持json,各种操作都非常流畅舒适。然而,当涉及到后端(C#)时,json很麻烦。C#本身不支持json,只能用作字符串或实体类的序列化形式。这需要转身,很麻烦。
有了node,后端也可以用js编码,这意味着json将得到原生支持。这样舒服多了。好好想想。前端创建json(实体类),然后提交给后端。后端收到json后直接处理(安全验证、业务处理),然后直接持久化。是不是很棒!
使用node的另一个优点是它可以在运行时定义实体类的属性,比如添加属性。这在C#中无法实现。
为什么必须在运行时修改实体类?因为这样做可以避免实体类数量的爆炸。
打开您的项目,计算定义了多少实体类。项目越大,实体类越多是真的吗?当需要进行更改并且需要向实体类添加属性时,是否需要各种代码更改?虽然VS可以帮我们做很多工作。
因此,最好在运行时随意修改实体类,这样可以大大避免修改代码的问题。(因为根本没有代码)
本文主要讲思路,简单设计一个json来表达。
设计这个json的目的是引擎可以根据json拼接SQL,然后交给数据库处理。
{ '操作方式' :' add ',//add update delete select ' table count ' 33601,//支持多表级联添加,修改' fieldInfo':[{//主表字段,参与操作字段,不参与操作字段。第一个字段是主键(不支持多个主键)' tableName': 't1 ',//table name。PrimaryKey':'id ',//主键字段名称。我不想将主键字段名限制为“id”' _ sqlcache ' : ' ',//缓存的sql语句。每次拼接sql都很烦人。获取一个缓存来存储拼接的sql。' fieldList':中涉及的字段{ //不需要把表中所有字段都放进去,客户端提交的json是根据业务需求设计的//对应' field1name' :' field1value ',' field 2 name ' : ' field 2 value ' } },{//从表中的字段可以不设置'。我不想将主键字段名限制为“id”,“外键”:“外键id”,//主键字段名。我不想将主键字段名限制为“id”' _ sqlcache ' : ' ',//缓存的sql语句。每次拼接sql都很烦人。获取一个缓存来存储拼接的sql。“字段列表”: {///(不包括外键字段)中涉及的字段不需要放在表中的所有字段中。//客户端提交的json对应表中的字段‘field 1 name’:‘field 1 value’,‘field 2 name’:‘field 2 value’}//第一个字段是主键,第二个字段是外键],‘findcol’:[{‘colname’:‘col 1’,‘key 1’:‘ABC’,‘key 2’:‘ABC’,//用于范围查询。例如,从日期到日期,“find kind”:“{ col name } like { key }”//查询方法:Like,not Like,in,=,between等。}]}一般的ORM以实体类为核心,要求实体类的完整性,也就是说一个实体类要映射一个完整的表。例如,要删除一个商品,通常的做法是从数据库中读取商品并将其实例化,然后修改标签属性(字段),然后持久化整个实体类(将其保存到数据库中)。
但是怎么写SQL呢?一个更新就可以了,而不是读取数据,这样效率会有点损失。
那么如果你想把所有的分类商品下架呢?这个分类里的商品都要甩出去,然后属性值要分批改变,分批持久化。
如果写SQL语句呢?或者那个SQL,只是改变查询条件,或者不需要折腾数据。在这种情况下,效率有很大的差异。
但是我的想法不是以面向对象为中心,而是以关系数据库为中心。
也就是说,实体类和表不会作为一个整体进行映射,而是属性和字段进行映射。也就是说,取出一个表中的一些字段,使之成为一个实体类,然后对其进行操作。例如,现成商品的例子
表:商品表
字段:isxiajia=1
条件:id=1(单个商品下架)cate=2(按分类下架)
然后生成一个更新语句。
这是一个独立的“实体类”,不需要商品的其他属性,因为只是一个下架操作。此外,查询条件是完全释放的,不仅按ID,还按其他字段,如分类字段。这样可以提高效率。
摘要
以上是边肖介绍的用Node.js实现ORM的思路的详细说明,希望对大家有所帮助。如果你有任何问题,请给我留言,边肖会及时回复你。非常感谢您对我们网站的支持!