来自学习和实操后的总结,有说得不对的,或者遗漏的,大家留言补充。希望这个贴子,能成为活字格老铁们使用外联库的一个指南。PS即使你不打算使用外联库,里面的一些方法,也值得看一看!

一、库表规划
1、系统表:如组织架构、用户、角色、权限等。活字格内置在sqlite中,无法直连,可通过视图方式读取出来
2、词典表dictionary:辅助填报的列表信息,如行政区域、男女、学历、岗位、合同类型、商品类别等。其中数据量多、结构比较独特或需要中台设定的,单独做表,如行政区域表(记录多)、商品类别(中台设定)等,其它放在通用词典表,做一些表设计,我一般是设置类别字段、属性字段(固定参/可变参)、排序字段、图片字段、三个字符字段,三个小数字段。
3、业务表business:记录业务的发生,这是使用最多的表
4、当前表current:存放当前值/累计值或档案类,如当前库存、累计销售、商品档案等
5、期末表end:存放某个时期的期末结存数,如月末库存
6、期间表period:存放某个时期内的发生值,如月销售统计

二、建表
1、表命名:目前我使用的表命令方法:模块英文标识_表主名使用驼峰法,如hr_employee,hr_employeeFamily
2、视图命名:模块英文标识v_视图的作用
3、函数命名:模块英文标识p_函数的作用
4、表名/字段长度:虽然mssql可以128个字符,但还是建议在64个以内
5、字段名全部用英文,字段全部用小写英文字母,字母开头,不同单词用_连接,不用复词,即使是内置的sqlite,也建议用英文名
6、表/字段设计时,尽可能都加注释,我会把字段注释全部入到表注释那里,省时间。如果字段有固定参的,最好也把固定参定上(2020-9-5改)
7、临时表,使用内置的sqlite表,可以提升效率,特别是进行中间计算或笛卡尔积时,能极大的提升效率,注意,是极大!
8、在活字格内先建表,然后在数据库IDE中设计表。这样会在前面几个字段自动建立ID(默认主键)、FGC_CreateDate、FGC_LastModifier、FGC_LastModifyDate、FGC_Creator、FGC_Rowversion、FGC_UpdateHelp字段。主键、并发、权限问题一次性解决。PS.自建字段千万不要去动,另外,外联表的字段设计不要在活字格里弄,因为数据类型有限。

三、字段
1、mysql里能用char,就不用vchar,mssql也一样。另外,mssql里,如果有中文就用nchar和nvarchar,纯英文和数字,那就用char和varchar
2、vchar不超过5000,如果超过,用text,并独立出一张表,用主键对应
3、tinyint-255,smallint-65535,int-42.9亿,bigint-最大,实际使用时再放大几个零
4、小数类型,如果是金融类的一定要用decimal(18,2),float(7位)和double(15位)自己选择。(2020-9-5改)
5、是否字段用is_,如果是表现已经状态,如is_deleted,1表示已删除
6、数据表虽然有二进制字段,但活字格的图片和附件都是以字符串形式记录地址,以防万一,在mssql里我都直接用nvarchar(max)来
7、表名、字段名、字段类型真得非常重要,在生产环境中,基本上没有机会可以更改,对有长度的字段类型,还是要留有余量

8、一张表只能有一个timestamp时间戳类型,如果你给活字格修改数据表的权限,活字格会自动帮你建一个,那是用来防止并发脏读的。重复一次,活字格自动建的几个字段,不要去改动,包括字段类型也不要去动!
9、SQL数据库的日期,一般有date、datetime、datetime2三种,活字格的日期对应的是datetime。之前,为了省资源,将日期设为了date,但期间出现的几次时间字段的数据库报错。出现几次后,发现了规律,就是数据库连接断开,重新连的时候,活字格会把date字段识别为文本,这样就会出现报错。所以,建议外联数据库的日期还是设置为datetime,时间则设置为time(7,0),和活字格的机制保持一致!

四、主键/外键
1、主键最好只用自然主键,不要和业务关联,比如活字格自动新建的ID字段,同时尽量避免用联合主键
2、外键使用比较讲究,先说逻辑外键,就是活字格中设置关联字段,但不设置联级约束,就是逻辑外键(在活字格里不能设置外联表的联级约束,需要在数据库IDE中设置),逻辑外键可以随意用。但联级约束外键要慎用,因为每次增改删都会触发联级查询,会影响效率。阿里的开发手册干脆就直接干掉联级外键了。
3、如果一定要用联级外键,注意以下几点:(1)引用列并不一定非要主键,但必须是唯一列;(2)外键列与引用列的数据类型/字符集/校对规则要一致;(3)外键列和引用列都必须建索引;(4)外键列引用多个列的,列顺序要一致;(5)大对象字段不要用做引用列;(6)外键命名在库里要唯一,命名规则fk_本表名_引用表名_on_引用字段,表名的模块缩写和结尾标识去掉;(6)如果子表弄了触发器,外键联级更新是不会触发的,所以这种情况不要用;(7)不再支持分区表了,所以有计划用分区表的,不要用外键;(8)高并发更新表情况下,一定一定要避免使用联级外键
4、虽然阿里不建议用联级外键,但在非常严格要求主子表一致性、表结构简单、并发不高、查询数据量不高时,可以用一下。其它情况,需要联级约束的,最好在前端通过设计来实现
5、身份证号、银行账号、社保账号之类敏感的字段,不要做主键或外键

五、索引
1、索引命名:主键索引pk_表名_字段名,表名的模块缩写和结尾标识去掉,唯一索引uk_,普通索引idx_。如果你选择在活字格中建外联表,会自动建立一个ID的索引(主键自动建索引),最好按规则改一下名。注:索引需要在数据表IDE中建,活字格中建不了
2、业务上具有唯一特性的字段,即使是多个字段的组合,如果要建立索引,则必须建成唯一索引
3、索引如果不确定要用,可以先不设置,后期进行sql优化时再使用。一般建在多表联接用的关联字段以及查询频率较高的条件字段上。
4、vchar索引,如果比较长,需要注意。一般20长度已经能覆盖90%的查询判断, 可以用count(distinct left(列名, 索引长度))和count(*)的来测试决定,设置方式column_name(length)
5、where和orderby有索引字段,且该字段在复合索引中时,将该字段放在复合索引最后
6、建组合索引的时候,区分度最高的在最左边。如where a=? and b=? ,如果 a 列几乎接近于唯一值,那么只需要单建a列 索引即可
7、存在非等号和等号混合时,在建索引时,请把等号条件的列前置。如:where c>? and d=? 那么即使 c 的区分度更高,也必须把 d 放在索引的最前列,即索引 idx_d_c
8、不要索引常用的小型表
9、查看select是否使用了索引、使用了哪个索引,可以使用用执行计划(EXPLAIN,在IDE中使用)查询结果,看key和key_len两项

10、mssql设置为主键和唯一键的,会自动建索引,不需要另外建;mysql的唯一键,是通过建立唯一性的索引来设置,主键也会自动建索引;

六、其它
1、join不要超过3个表,join字段数据类型必须一致。多表关联查询时,保证被关联的字段需要有索引。
2、查询先快速定位需要获取的 id 段,然后再关联,如:SELECT a.* FROM 表 1 a, (select id from 表 1 where 条件 LIMIT 100000,20 ) b where a.id=b.id
3、如果对字符编码和引擎不熟悉,反正看到UTF8、innodb的字眼,选它就对
4、反范式:字段允许适当冗余,以提高查询性能,但必须考虑数据一致。冗余字段应遵循:(1)不是频繁修改的字段;(2)不是 varchar 超长字段,更不能是 text 字段;(3)不是唯一索引的字段。举个例子就明白:商品类目名称使用频率高,字段长度短,名称基本一不变,可在相关联的表中冗余存储类目名称,避免关联查询。看了一个测试,150万的数据,一个35秒,一个几秒,惊呆了
5、通常数据库优化的方向:(1)服务器硬件(三大件);(2)服务器布置环境(比如你用mysql,就一定不能在windows环境里);(3)SQL本身优化;(4)反范式;(5)索引优化。查一下关键词“慢查询”、“慢sql”、“perl”。
6、阿里开发手册是禁止使用存储过程的,认为存储过程难以调试和扩展,更没有移植性。但也有人认为可以使用,比如一些常用的关联表功能组,还是可以封装。但原则是前后端设计能解决的,就不要用存储过程,特别是现在有了服务端命令,应该可以尽量避免使用
7、设计视图要从业务出发,视图和业务建立一对一的关系,不要因为想让一个视图为多个业务服务,而放进不需要的语句、表和字段。视图不要嵌套视图,效率会被大大影响,和join一样,也不要超过3个表。太复杂的,可以考虑走存储过程,效率会更高。活字格中不能直接建立外联表的视图,需要在数据库IDE中建立,导入时需要选择主键,SQL里视图是没有主键概念的,但既然它让你设,你就设一个吧,据说能提高性能。而且,如果你不设,表名旁边的图标会显示为和普通表一样,而且不是视图特有的图标,完美主义者的我,是不能容忍这种事情的
8、关于外联表选mssql还是mysql,如果活字格服务端和数据库在同一个服务器,还是自己安装数据库,就用mssql,大多数人推荐2008R2和2012,我已经升级到2012。这种情况选mssql的原因,一是阿里云和腾讯云亲测都可以安装使用,盗不盗版,如果不是做公有云布置,估计也没啥问题,二是windows环境还是用mssql,而且活字格是.net的,属于一家人;三是你自己下载安装的mysql和腾讯云提供给你的mysql是不一样的,自己安装的话,最好不选mysql。如果是使用阿里云或腾讯云的云数据库,那就选 mysql,一是更便宜,二是他们都做了优化,也有很多优化工具可以使用,比如前面的慢sql,不比mssql差。
9、数据库IDE,因为计划只用sqlserver,所以改用原生的IDE,SQLserver同一个安装包,安装时只选IDE就可以,可网上搜教程(2020-9-5改)
10、最后说说,我对选内置数据库还是外联数据库的看法。既然写了这么多外联数据库的东西,自然我的选择是外联数据库了。选什么不重要,重要的是为什么选?所以简单说一下原因:(1)百度sqlite,出现最多的关键词,是轻型、嵌入、桌面、不需要配置安装,然后sqlite支持高并发的读,但不支持高并发的写,等等,我们是要用活字格来做企业业务应用的,而且是web应用,你会觉得sqlite的特点和需求吻合吗?;(2)上面说了很多数据库优化的东西,无论是mssql还是mysql,都有非常多的优化教程、方法和工具,阿里云和腾讯云也都有提供专门的数据库优化工作和方案,我认为在数据量到百万甚至是几十万级的时候,性能上的表现一定会突出出来,而sqlite的优化空间太小;(3)接触到外联数据库,我才打开了一个新的窗口,才能写以上的东西。我相信很多用内置库的老铁们,表名字段名还是用中文吧,你不用外联库,你就根本不会关注到这些东西;(4)外联mysql和mssql都可以直联,这样可以方便的相互窜门,而sqlite虽然是活字格内置的,但却不能直连。
PS:虽然我选择了外联数据库,但我仍然会经常用到内置库,比如前面说的,在一些临时表和中间表的使用上,我基本上都是用sqlite,很多情况下,执行效率比外联表高很多,这样你的外联库看上去也清爽些。所以,活字格的内置库用sqlite我觉得挺好的,内置和外联,相互补充。另外,新接触低代码系统的老铁们,进入门槛也大大降低了~~~

11、看了几篇关于mysql和mssql安全性能的比较,以及云开发中云函数可以外接mysql,再加上两者云数据库相关两三倍的价格,心血来潮,花了一天时间捣鼓mysql,结果踩了坑。测试的环境,包括(1)使用腾讯云数据库mysql,与安装活字格的腾讯云服务器在一个私有网络内连结;(2)直接在安装活字格安装腾讯云服务器上自建mysql。原来环境是在腾讯云服务器中自建mssql。结果两个mysql环境效率,都比mssql环境,低了2倍左右。这个结果,不能说mysql的执行效率比mssql低,但至少可以下结论:活字格中,使用mssql比使用mysql的效率更高。所以使用外联数据库,还是好好把mssql用好。附两个测试点:(1)页面表格500行数据,使用提交表格命令,mssql>2-3分钟左右,mysql>6-8分钟
(2)页面两个表格,根据单元格值变化执行查询命令,mssql>1秒左右,mysql>3-5秒

12、另外,也总结一下使用mysql的注意事项:
(1)字符集选择utf8或utf8mb4,腾讯云官方是建议直接用uft8mb4,能支持表情字符,因为很多人的微信名会用表情字符。这两种字符集,排序规则都用general_ci。这个和mssql不一样,在mssql里,没有字符集的选择,是通过选择排序规则来选择的,选Chinese_PRC_CI_AS
(2)是否,用tinyint(1)
(3)补充一下几个小数float、double和decimal的应用,三个精度依次提升,但效率也依次降低,和前文说的有不一样的地方。A、金融相关的,一定用decimal,大小一般设置为(18,2),不用decimal,会遇到浮点不等情况;B、float效率最快,但只有7个有效位,比如你设置为(7,4)的话,最多只能表示***.****, 一些参数型、百分率的字段我会用到;C、double翻一倍,15个有效位
(4)mysql的数据类型更少,比如没有nvarchar(max)、varchar(max)这样的,所以在mysql里,长文本要用text
(5)活字格的图片和附件转到mysql,是用varchar(500),多附件这种,可能会遇到字符长度不够的情况,如果预计不够,会要改一下。不过至今我还是没搞清楚,究竟varchar最长可以放多少个字符,找资料,有说255的
(5)mysql里没有设置唯一键的地方,是通过建唯一索引来设置唯一键,索引类型一般选unique或normal(index),索引方法一般BTREE。主键会自动建一个索引

活字格外联数据库SQLServer和Mysql的经验(大多数经验也适合其它使用外联数据库的平台)的更多相关文章

  1. 你搞懂 ORACLE、 SQLSERVER、MYSQL与DB2的区别了吗

    ORACLE. SQLSERVER.MYSQL与DB2的区别--平台性:    Oracle.MYSQL与DB2可在所有主流平台上运行:    SQL Server只能在Windows下运行: --安 ...

  2. 【转】数据库介绍(MySQL安装 体系结构、基本管理)

    [转]数据库介绍(MySQL安装 体系结构.基本管理) 第1章 数据库介绍及mysql安装 1.1 数据库简介 数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新 ...

  3. MySQL、SqlServer、Oracle三大主流数据库分页查询 (MySQL分页不能用top,因为不支持)

    一. MySQL 数据库 分页查询MySQL数据库实现分页比较简单,提供了 LIMIT函数.一般只需要直接写到sql语句后面就行了.LIMIT子 句可以用来限制由SELECT语句返回过来的数据数量,它 ...

  4. SQLServer数据库转换成MySQL数据库

    由于工作需要,系统原先的SQLServer数据库要转换成MYSQL数据库,所以这两天就一直在查阅这方面的资料.最开始,我尝试从SQLServer中导出SQL文件,然后导入到MYSQL数据库中,发现报错 ...

  5. 怎样将Sqlserver数据库转成mysql数据库

    手上有一个网站之前是用asp.net做的,所使用的数据库是sqlserver,现在打算用PHP+MYSQL架构.因原来的站点有一定排名,直接改版的话,会导致产生很多错误页,网站排名和收录结果要恢复过来 ...

  6. 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合

    在开发项目的时候,往往碰到的不同的需求情况,兼容不同类型的数据库是我们项目以不变应万变的举措之一,在底层能够兼容多种数据库会使得我们开发不同类型的项目得心应手,如果配合快速的框架支持,那更是锦上添花的 ...

  7. 各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包----转

    在开发基于数据库的应用系统时,需要在项目中进行数据源的配置来为数据 库的操作取得数据库连接.配置不同数据库的数据源的方法大体上都是相同的,不同的只是不同数据库的JDBC驱动类和连接URL以及相应的数据 ...

  8. Oracle、Db2、SqlServer、MySQL 数据库插入当前系统时间

    做易买网项目,由于对数据库插入系统时间不了解,常常遇到的问题: 1.java.sql.SQLException: ORA-01861: 文字与格式字符串不匹配.原因:由于获取系统时间类型不对,应为sy ...

  9. ABP框架使用Mysql数据库,以及基于SQLServer创建Mysql数据库的架构和数据

    ABP默认的数据库是SQLServer,不过ABP框架底层是EF框架,因此也是很容易支持其他类型的数据库的,本篇随笔介绍在ABP框架使用Mysql数据库,以及基于SQLServer创建MySql数据库 ...

随机推荐

  1. Unity3D中可重载虚函数的总结

    重载虚函数:Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结. A ...

  2. Spine学习九 - 冰冻效果

    想象这样一个效果,一个人被冰霜攻击命中,然后这个人整个就被冰冻了,那么spine动画要如何实现这个效果呢? 1.首先需要一个Spine动画,这个动画应该是相对静止的,因为人物已经被冰冻了,那么这个人儿 ...

  3. MaterialPropertyBlock

    在unity中,有这样一种情形,有许多的物体,都使用了相同的材质球,但是呢,具体的细节又有些微的不同,如果想要些微的改变每一个 网格的颜色,改变 渲染状态是不行的. 这时,就可以使用MaterialP ...

  4. 【HttpRunner v3.x】笔记—7. 测试用例-teststeps-RunTestCase

    以前我在写接口自动化用例的时候,为了保证用例的独立性,需要在setUp里调用各种满足用例的一些前置条件,其中就不乏调用了其他测试用例中的方法. 而httprunner也是支持了这一项很重要的特性,通过 ...

  5. python简介以及简单代码——python学习笔记(一)

    学习来源:https://www.liaoxuefeng.com/wiki/1016959663602400 了解python 简单编写并实现python代码 命令行模式和python交互模式 了解p ...

  6. KMP记录

    例题:luogu P3375 [模板]KMP字符串匹配 知识点:1.KMP模板,熟悉KMP 2.理解KMP过程:失配时,是从后缀转向前缀.即失配时,匹配串是从尾转到头继续匹配,被匹配串不改变. 3.注 ...

  7. 常见的开源 License

    目录 什么是开源软件 什么是 license 商业许可证与开源许可证 对开发者的影响 开源许可证的类型 如何选择开源许可证 什么是开源软件 开放源代码的软件.假设有一天自我感觉代码能力不错,写了个小工 ...

  8. linux 常用目录的作用

    . /   根目录 . /bin     命令保存目录(普通用户就可以读取的命令) . /boot   启动目录,启动相关文件 . /dev    设备文件保存目录 . /etc      配置文件保 ...

  9. springBoot 使用webSocket

    本文(2019年6月18日 飞快的蜗牛博客) 有许多人走着走着,就迷失了自己,所以不论发生了什么,有时候抱着自己去静下来想想,要好好的对待自己:"钱塘江上潮信来,今日方知我是我", ...

  10. Unit5:广播

    静态广播 1.定义 public class TestBroadCast extends BroadcastReceiver { @Override public void onReceive(Con ...