1. 程式人生 > >用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思路

  ORM是O和R的對映。O代表面向物件,R代表關係型資料庫。二者有相似之處同時也各有特色。就是因為這種即是又非的情況,才需要做對映的。   理想情況是,根據關係型資料庫(含業務需求)的特點來設計資料庫。同時根據面向物件(含業務需求)的特點來設計模型(實體類)。然後再去考慮如何做對映。但是理想很骨jia

Node.js實現Restful風格webservice

Restful風格的WebService正在漸漸取代傳統的SOAP, Java 也有很多Restful的框架,很方便簡潔,Jersey,restlet,甚至SpringMVC也可以,不得不說Rest讓人從Web轉型到WebService更容易和方便,當然深入Restful

JS原生程式碼實現圖片輪播無縫切換的思路

JS實現圖片輪播是個老生常談的問題,也是新手的必由之路,在這裡提供一種思路,供大家參考: 1.生成DIV做外框,並設定overflow:hidden;  // 每個方法都必須有的 2.建立一個數組arr,放置圖片地址 3.生成兩個並排的圖片img1,img2,初始化圖片地址

現有 Vue.js 專案快速實現多語言切換的思路

Web 專案多語言(i18n,即國際化)是比較常見的需求,常規的做法大概有以下幾種: 1. 每種語言單獨開發頁面,適用於 CMS 之類的網站 2. 多語言文字和頁面結構分離,執行時動態替換。適用於單頁應用(SPA) 3. 直接用網頁翻譯外掛,機器翻譯。這種效果不太理想,同時有一些侷限性(後面會講到) ## 問

js實現搖功能

ice 彈出 update 運動 including scrip read log 頁面 function init(){   if (window.DeviceMotionEvent) {     // 移動瀏覽器支持運動傳感事件     window.addEvent

node.js搭建一個靜態資源站 html,js,css正確加載 跳轉也完美實現

都在 加載 簡單 pipe tps color exec create 包含 昨天剛買了一個服務器想著用來測試一些自己的項目,由於是第一次建站,在tomcat,linux,node.js間想了好久最終因為node搭建比較方便沒那麽麻煩就決定用node.js來搭建網站項目。

怎樣js實現段HTML元素設定隨機顏色字型(親測可用)

用JS為一段HTML元素設定隨機顏色字型 HTML中的元素 <p id='broadcast'>testtest</p> JS部分 var chars = ['0',

優化JS載入時間過長的思路

1.背景 去年公司在漳州的一個專案中,現場工程人員反映地圖部分出圖有點緩慢,大約需要20多秒。和另外一個同事一起花了一兩天進行了程式碼優化、程式碼壓縮、中介軟體優化以及服務部署優化後使地圖出圖縮短到了9秒上下。 這裡對上次的經驗做一個總結,提供一種優化JS檔案載入時間

查詢Excel表格中的某列資料【Node.js實現

const fs = require('fs') const xlsx = require('node-xlsx') const sheets = xlsx.parse('example.xlsx') sheets.forEach(sheet => { // 獲取整個excel

SpringMVC同時支援多檢視(JSP,Velocity,Freemarker等)的思路實現

第一種方式: 在基於SpringMVC的專案中有時需要同時使用多種檢視格式,如jsp,velocity及freemarker等,通過不同的請求路徑配置規則,對映到不同的檢視檔案。下面我提供一種思路,通過檢視模板檔案字尾名的方式來進行處理。例如: @RequestMap

Android進階——自定義View之擴充套件系統控制元件的另思路實現漸變文字動畫的TextView

引言 前面幾篇文章 繼承或組合系統現有控制元件實現新控制元件,擴充套件新功能都是在對應的構造方法中去擴充套件的,但千萬不要把思路侷限於只能在構造方法中去擴充套件,這篇就簡單地分享另一種思路,通過重寫對應的週期方法實現擴充套件。 一、View中幾種重

node.js(socket.io)實現資料實時推送

1.setInterval每隔n秒去非同步拉取資料(缺點:更新不夠實時) 2. AJAX輪詢方式方式推送資料(缺點:服務端需要在死迴圈中反覆查詢資料庫) 3.websocket推送資料(缺點:僅支援html5標準的瀏覽器) socket.io的簡要介紹 所有客戶端都通過socket.io掛

AFN實現併發結束後回撥攔截的思路

原創帖子,轉載請註明出處:http://blog.csdn.net/sbvfhp/article/details/48112333 需求:有三個併發的通訊執行緒,三個通訊都結束後,進行一個回撥攔截(當然這個也可以用AFN提供的方法實現,這裡只是研究自己的一種實現)

SUI Mobile中解決分頁js和css的思路

初次接觸MSUI,對其ajax重新整理頁面的效果很滿意。但是在團隊開發中,卻發現在使用路由時,卻發現框架並不引入路由頁面的css,更不執行頁面上的js。檢視官方文件: MSUI官方文件,路由頁面JS安全問題 切換到的新頁面中的 js 不執行 由於瀏

Node.js實現戶評論社區(體驗前後端開發的樂趣)

文件 lis thead for ole 我們 javascrip 教程 parse 前面 接著上一節的內容來,今天我們要完成一個用Node開發後臺服務器,實現一個簡單的用戶評論社區。可以先看下效果圖: 開始 建立項目文件夾comment-list,在裏面新建一個pu

Node + js實現大檔案分片上傳基本原理及實踐()

閱讀目錄 一:什麼是分片上傳? 二:理解Blob物件中的slice方法對檔案進行分割及其他知識點 三. 使用 spark-md5 生成 md5檔案 四. 使用koa+js實現大檔案分片上傳實踐 回到頂部 一:什麼是分片上傳? 分片上傳是把一個大的檔案分成若干塊,一塊一塊的傳輸。這

方便大家學習的Node.js教程():理解Node.js

圖形 -1 iter pri attribute set run 相對 mage 理解Node.js 為了理解Node.js是如何工作的,首先你需要理解一些使得Javascript適用於服務器端開發的關鍵特性。Javascript是一門簡單而又靈活的語言,這種靈

加速 Unity 不同平臺打包的思路

安裝 轉化 定期 進行 unity 單獨 創建文件 不同 提高 Unity打包總的來說還不是一件特別復雜的事情, 但是我們知道任何關於跨平臺(多線程等)這類問題, 總是會把事情搞得復雜起來. 以前項目的打包是通過Jenkins對一個工程下對不同平臺多次打包, 不可避免需要切

Node.JS+MongoDB搭建個人博客(model目錄)(三)

數據庫 技術分享 操作 釋放 災難 存儲 需要 http 三個參數 model目錄主要是封裝一些經常使用的方法,便於使用。 setting.js文件: 很簡單,就單單封裝了一個url作為公用,以後改就方便改了。 md5.js(不推薦用): db.js文

node.js express設置路徑後 子路徑下的頁面訪問靜態資源路徑出問題

ref gin images ejs title use func tle public 在routes/news_mian.js 設置了訪問news_main.html 的路徑 ‘/‘,通知設置一個訪問news-page.html的子路徑‘/newspage‘子路徑。但是