产品的定位

做产品的都知道,是否支持多语言直接影响到产品的定位问题。

如果一个产品周期是一年的话,要完美支持多语言最少也得在加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=
4、var list=db.Qureyable<原视图名>().ToList()
ORM会自动识别新的视图进行查询,生成的SQL如下 SELECT * FROM 新视图名

下面是具体代码: 
  using (SqlSugarClient db = SugarDao.GetInstance())//开启数据库连接
{
db.Language = new PubModel.Language()
{
LanguageValue=,//多语言的值一般从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 = ;//我们在把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

多语言架构下如何正确的使用SQL视图的更多相关文章

  1. OpenGL Insights 阅读有感 - Tile Based架构下的性能调校 翻译

    Performance Tunning for Tile-Based Architecture Tile-Based架构下的性能调校 by Bruce Merry GameKnife译 译序 在大概1 ...

  2. MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务

    ASP.NET Web API和WCF都体现了REST软件架构风格.在REST中,把一切数据视为资源,所以也是一种面向资源的架构风格.所有的资源都可以通过URI来唯一标识,通过对资源的HTTP操作(G ...

  3. Rest架构下的增删改查

    首先还是要连接一下什么是Rest, REST是英文representational state transfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP, ...

  4. Re:从 0 开始的微服务架构--(四)如何保障微服务架构下的数据一致性--转

    原文地址:http://mp.weixin.qq.com/s/eXvoJew3bjFKzLLJpS0Otg 随着微服务架构的推广,越来越多的公司采用微服务架构来构建自己的业务平台.就像前边的文章说的, ...

  5. asp.net core系列 62 CQRS架构下Equinox开源项目分析

    一.DDD分层架构介绍 本篇分析CQRS架构下的Equinox开源项目.该项目在github上star占有2.4k.便决定分析Equinox项目来学习下CQRS架构.再讲CQRS架构时,先简述下DDD ...

  6. x64架构下Linux系统函数调用

    原文链接:https://blog.fanscore.cn/p/27/ 一. 函数调用相关指令 关于栈可以看下我之前的这篇文章x86 CPU与IA-32架构 在开始函数调用约定之前我们需要先了解一下几 ...

  7. Arm64架构下静态编译Nginx

    这段时间,我一直忙于将 Rainbond 源码构建模块移植到 Arm64/aarch64 架构中.这一源码构建模块可以将指定代码仓库中包含的源码,拉取构建成为容器镜像,在各种容器平台中运行.目前支持的 ...

  8. Arm64架构下编译便携Python

    这段时间,我一直忙于将 Rainbond 源码构建模块移植到 Arm64/aarch64 架构中.对于 Python 项目而言,可以直接通过源代码编译成为可运行在各种容器平台之上的容器镜像.这个过程不 ...

  9. 100行代码实现一个RISC-V架构下的多线程管理框架

    1. 摘要 本文将基于RISC-V架构和qemu仿真器实现一个简单的多线程调度和管理框架, 旨在通过简单的代码阐明如何实现线程的上下文保存和切换, 线程的调度并非本文的重点, 故线程调度模块只是简单地 ...

随机推荐

  1. 《你必须知道的.NET》读书笔记:从Hello World认识IL

    通用的语言基础是.NET运行的基础,当我们对程序运行的结果有异议的时候,如何透过本质看表面,需要我们从底层来入手探索,这时候,IL便是我们必须知道的基础. 一.IL基础概念 1.1 什么是IL? IL ...

  2. 解读jQuery中extend函数

    $.extend.apply( null, [ true, { "a" : 1, "b" : 2 } ] );//console.log(window.a); ...

  3. windbg 基础命令实战 - 简单程序破解

    以前玩游戏遇到一些实在过不去的管卡,经常会找一些游戏修改软件来修改游戏,让自己变得无比强大,将boss一路砍瓜切菜过足游戏瘾.其实游戏修改软件的功能大多都比较简单,我们可以通过windbg的一些简单命 ...

  4. Android多线程分析之二:Thread的实现

    Android多线程分析之二:Thread的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处   在前文<Android多线程分析之一 ...

  5. 自定义 Azure Table storage 查询过滤条件

    本文是在Azure Table storage 基本用法一文的基础上,介绍如何自定义 Azure Table storage 的查询过滤条件.如果您还不太清楚 Azure Table storage ...

  6. UWP 入门教程2——如何实现自适应用户界面

    系列文章 UWP入门教程1——UWP的前世今生 如上文所说的,布局面板根据可用的屏幕空间,指定界面元素的大小和位置.例如StackPanel 会水平或垂直排列界面元素.Grid 布局与CSS 中的表格 ...

  7. Vuejs注意点

    1.多级联动的时候,前一级变的时候,首先要把后面级的内容清空,要不然用户可能把前一次后面级的选择和新的前一级的选择提交(即后边级的列表渲染出来了,单但用户没有选择,此时vue绑定的是上一次的数据). ...

  8. 掌握js模板引擎

    最近要做一个小项目,不管是使用angularjs还是reactjs,都觉得大材小用了.其实我可能只需要引入一个jquery,但想到jquery对dom的操作,对于早已习惯了双向绑定模式的我,何尝不是一 ...

  9. HTML学习入门

    HTML(元素.属性) HTML: 超文本标记语言   1. 超文本即为带有链接属性的文本  2.标记即为标签 一.body属性: bgcolor:页面背景颜色 text:文字颜色 backgroun ...

  10. Atitit.java图片图像处理attilax总结

    Atitit.java图片图像处理attilax总结 BufferedImage extends java.awt.Image 获取图像像素点 image.getRGB(i, lineIndex); ...