低代码-数据库设计

211 阅读3分钟

@TOC

低代码-数据库设计

常用数据库设计思路

常见的设计的思路

  • 传统关系型数据库
  • no-sql实现

传统关系型数据库

首选 毫无疑问 mysql。别问,问就是用了很多年了 mysql有2种方案

  • 横向设计法 (目前采用这一种)
  • 列式设计法

横向设计法

用户在界面上拖拉拽出一个表单,则后台对应建一张表。

好处

  • 方便查询
  • 方便后续统计导出
  • join

坏处

  • 表字段增减会有性能问题

纵向设计法

纵向设计法分为2种

  • a、同样在页面上一个表单对应一张表,但是真实建表 建200列,当做扩展字段
  • b、整个系统只有X张不同数据表(日期,数值,文本类型表)

好处

  • 列式的存储概念
  • 容易应付数据量不大的场景

坏处

  • 客户的表不是隔离的,如果备份是个大问题
  • join操作很难解决,很难解决查询的问题

非关系型数据库

mongdb 个人感觉也是一个门槛,但是也是一个解决方案 或者使用其他 大数据类数据库

采用的实际办法

传统关系型数据库, 横向设计法

好处是显而易见,坏处也是一目了然。但是这种设计是符合一个程序员的正向思路,并且是类似于正常做需求的一个习惯性建表。但是怎么解决 坏处呢? 苦思冥想 有了一个不成熟的答案

解决办法

  1. 产品定位上 不允许 跨类型修改字段。数值就是数值,文本就是文本,日期就是日期。抓住几个大类数据类型。
  2. 在建表生成的时候,根据类型 建立一个比较大的类型。
  3. 除了增加新的列,真实增加。其他的操作都是逻辑操作

产品定位类型问题

1、不能随意更换字段类型, 可以增加 前缀后缀 和 长度,但是不能变更为其他类型

image.png

2、增加不同类型的基础类型

image.png

建表的解决办法

1、建表语句

     <if test="dto.list!=null and dto.list.size()>0">
        <foreach collection="dto.list" item="list" separator=",">
            `${list.columnName}` ${list.type}(${list.length}) 
            <if test="list.isNull ==1"> DEFAULT NULL </if>
            <if test="list.isNull ==0"> NOT NULL DEFAULT ${list.defaultValue} </if> 
            COMMENT '${list.columnDesc}'
        </foreach>
     </if>

2、建表的字段 定义的不同类型,对应长一点

	VARCHAR("500"),
	TEXT(""),
//	LONGTEXT(""),
//	TINYINT("4"),
	INT("11"),
	BIGINT("20"),
	DECIMAL("50,4"),
	DATE(""),
	DATETIME(""),
	;

3、增加表的元数据表

  • 元素表
  • 元素表列名

image.png

application_table

  `db_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '库名',
  `table_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '表名称',
  `table_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '表描述'

application_table_column
  `table_id` bigint NOT NULL DEFAULT '0' COMMENT '表id',
  `column_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '列名',
  `column_desc` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '列描述',
  `length` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '长度',
  `is_null` tinyint NOT NULL DEFAULT '0' COMMENT '是否为空(0:否 1:是)',
  `category_type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '页面类型',
  `type` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '类型',
  `default_value` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '默认值'

对于新增列,考虑到性能问题,使用8.0版本mysql