多語言架構下如何正確的使用SQL視圖

来源:http://www.cnblogs.com/sunkaixuan/archive/2016/07/27/5709583.html
-Advertisement-
Play Games

產品的定位 做產品的都知道,是否支持多語言直接影響到產品的定位問題。 如果一個產品周期是一年的話,要完美支持多語言最少也得在加3個月!所需時間和頁面數量、資料庫表的數量和表的數據量成正比。 可以看出代價有多大,我們程式員就得和老闆嘮叨,做不得,成本太高。 如果前期不做,等到了後期項目表結構等都要重構 ...


產品的定位

做產品的都知道,是否支持多語言直接影響到產品的定位問題。

如果一個產品周期是一年的話,要完美支持多語言最少也得在加3個月!所需時間和頁面數量、資料庫表的數量和表的數據量成正比。

可以看出代價有多大,我們程式員就得和老闆嘮叨,做不得,成本太高。

如果前期不做,等到了後期項目表結構等都要重構,如果使用了大量的視圖對於多語言來說就是惡夢。

 

非資料庫方面的解決方案

請看我上一篇貼子 http://www.cnblogs.com/sunkaixuan/p/5699744.html

 

資料庫表的設計

對於多語言來說最重要的就是清單表的設計, 就拿簡歷來說吧,至少會用到十幾張清單表 (當然你也可以存儲在一張表裡用分類

學歷表:小學、中學、大學、博士 等等 

工作年限表:習實生,1年工作經驗,2年工作經驗等等

...

 

多語言架構清單表的設計誤區

如下圖這種設計是存在嚴重缺陷的,列來存語言難道我多一種語言就要加一列,顯然是不合理的

錯誤方案

 

 

正確的設計方案

 

名稱                      清單ID     語言ID

Primary education   1            1

小學                       1            2

middle school         2            1

初中                       2            2

數據結構應該是這樣的至少,相同的東西是一樣的ID,名稱不一樣而已,產品架構千萬不要用列存儲。

 

這種表架構又會出一個問題

當使用語言ID來作為篩選時,就會遇到一個很大的問題,沒錯那就是視圖的JOIN問題,如果我在視圖裡面寫

人員表 JOIN 學歷表  ON   學歷表.ID=人員表.學歷ID  AND  學歷表.語言ID=幾 

沒法寫了對不,如果我在視圖裡寫了1那就意味著我查出來的清單都只會是一種語言(語言ID為1的那個語言)

 

視圖的作用

視圖相當於虛擬表,可以方便的復用,視圖還可以套視圖,並且視圖在索引合理的情況下,比單表查詢還要快。 (索引覆蓋就是一個很好的例子)

 

那怎麼辦呢?SqlSugar ORM已經為我們做好這一切

隨著ORM性能瓶頸的提升,都玩會了EMIT 緩存這套,甚至拉姆達TO SQL都有開源項目 大大降低了ORM的門檻,SqlSugar也是拉姆達解析加EMIT玩的最早的ORM之一。

SqlSugar是為通用框架搭建而生,擁有了一定量的使用者,在6600萬高併發的測試中也得到了使用者的好評。

雖然也有很多朋友抱怨問題,大致會有兩個問題 實體轉換報錯,其實是欄位類型不配引起的或者更改了表結構沒有把.NET實例重啟因為有緩存的原因。

我不能保證我的代碼寫的多優雅,但能保證我寫的代碼都能看懂。我寧可寫IF ELSE也不會寫讓我腦子在轉一圈的代碼,我不會因為我一天能解決的問題去套一個使我花2天以上解決問題的設計模式,合理封裝便可,沒有過度設計。

 

SqlSugar在很多細節上都做過處理,比如線程安全、事務隔離等參數

 

使用SqlSugar ORM解決視圖問題

 

1、我們就把視圖語言ID設為1 (1為預設語言)
人員表 JOIN 學歷表  ON   學歷表.ID=人員表.學歷ID  AND  學歷表.語言ID=1

2、我們可以使用 LanguageHelper.UpdateView(db.Language, db); 幫我們生成其它語言的視圖,只要使用在Application_Start執行一次便可以,當視圖發生變化也需要在調一次或者重啟程式

只要視圖源碼中包含LanguageId=1的所有視圖都會創建出新的視圖並且把
LanguageId=1替換成你想要的ID


3、他會根據參數生成一個新的視圖 原視圖名_$_
EN ,新的視圖和原視圖一樣只是名稱和語言的值發生了變化
人員表 JOIN 學歷表  ON   學歷表.ID=人員表.學歷ID  AND  學歷表.語言ID=2

4、var list=db.Qureyable<原視圖名>().ToList()
ORM會自動識別新的視圖進行查詢,生成的SQL如下 SELECT * FROM 新視圖名


下麵是具體代碼:

 

  using (SqlSugarClient db = SugarDao.GetInstance())//開啟資料庫連接
            {
                db.Language = new PubModel.Language()
                {
                     LanguageValue=2,//多語言的值一般從COOKIES或SESSION取
                     Suffix="en"//多語言尾碼同上
                };
                //給上面賦值後下麵的程就可以使用了
                int lanId=db.Language.LanguageValue;
                var list = db.Queryable<LanguageTest>().Where(it => it.LanguageId == lanId).ToList(); 


                /****************************多語言視圖才是最大的問題***********************************/


                //註意視圖裡里怎麼辦呢?視圖裡面的JOIN用到語言表怎麼處理呢
                //我們就寫一個簡單的視圖作為例子,代碼如下
                /*create view V_LanguageTest
                    as
                    select * from LanguageTest where LanguageId=1
                 */

                //下麵這代碼寫到 application_start  不需要重覆執行
                LanguageHelper.UpdateView(db.Language, db);
                //執行完上面的代碼會創建把所有帶LanguageId=1的視圖全部生成其它語言的視圖
                //現在資料庫就有了 V_LanguageTest_$_en

                // V_LanguageTest_$_en結構如下
                /*create view V_LanguageTest_$_en
                 as
                 select * from LanguageTest where LanguageId=2
                 */

                //V_LanguageTest__$_en 是我SqlSugar自動幫你創建的 當視圖發生變化需要重新執行 LanguageHelper.UpdateView(db.Language, db);

                var list2=db.Queryable<V_LanguageTest>().ToList();
                //生成的Sql等於 select * from V_LanguageTest_$_en 

                 
                db.Language.LanguageValue = 1;//我們在把LanguageValue改成1
                db.Language.Suffix = null;//尾碼清空
                var list3 = db.Queryable<V_LanguageTest>().ToList();

                //生成的Sql等於 select * from V_LanguageTest

                //註意當 Suffix為null時使用的原始視圖

                //自定義視圖替換規則請看下麵兩個參數
               //db.Language.ReplaceViewStringKey 預設值為LanguageId=1
               //db.Language.ReplaceViewStringValue 預設值為LanguageId = {0}
                
            }

 

SqlSugar學習下載地址:

http://www.cnblogs.com/sunkaixuan/p/5654695.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 使用同義詞和insert..from..語句,解決訂閱庫數據丟失的問題 ...
  • SQL分類: DDL—數據定義語言(CREATE,ALTER,DROP,DECLARE) DML—數據操縱語言(SELECT,DELETE,UPDATE,INSERT) DCL—數據控制語言(GRANT,REVOKE,COMMIT,ROLLBACK) 首先,簡要介紹基礎語句: 1、說明:創建資料庫  ...
  • Oracle text-Oracle Text的體系架構 一、 Oracle Text 索引文檔時所使用的主要邏輯步驟如下: (1)數據存儲邏輯搜索表的所有行,並讀取列中的數據。通常,這隻是列數據,但有些數據存儲使用列數據作為文檔數據的指針。例如,URL_DATASTORE 將列數據作為URL使用。 ...
  • 假如有一張大表,現在需要增加一個非聚集索引,對於DBA來說,要有預估其大小以及執行時間的估算能力,尤其對一些企業使用SSD硬碟,其硬碟空間很是寶貴,增加索引如果錯誤預估其大小,很有可能導致硬碟資源超出預期使用量,造成沒必要的麻煩,這裡只針對其預估硬碟占用空間展開討論,行為標準8060 in_row_ ...
  • 慕課網sql server學習 資料庫第一印象:desktop--web server--database server** 幾大資料庫:sql server、oracle database、DB2、MySql、MongoDB。。。。。(SQL結構性查詢語言) 安裝軟體:SQL Server Man ...
  • win7 64位 oracle 11g 先登錄到sqlplus: sqlplus /nolog; sqlplus /nolog; 登錄資料庫: conn system/manager as sysdba; conn system/manager as sysdba; 然後啟動資料庫: startup ...
  • 1、安裝所需軟體包 # sudo su # yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel # yum install gcc perl-ExtUtils-MakeMaker 2、下載&安裝 # cd ...
  • 上一篇線上文檔預覽方案-office web apps發佈後收到很多網友的留言提問,所以準備再寫一篇,一來介紹一下域控伺服器安裝,總結一下大家問的多的問題,二來宣傳預覽服務安裝與技術支持的事情。 閱讀目錄 域控伺服器安裝步驟 常見問題 技術支持服務 總結 回到頂部 域控伺服器安裝步驟 域控伺服器安裝 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...