基于视图的增删改查操作(颠覆传统思维吧)
视图是关系型数据库提供的一个非常强大好用的功能,它提供了一种基于基本表(相对视图的虚拟表而言)的数据提取重组和分隔技术。
视图通过对一个或者多个基本表进行数据提取和重新组织,将数据以用户希望的方式重新呈现。
需要注意的是,视图的主要目的就是重新组织多个基础表的数据以新的方式展现,重点是数据展示,并不涉及到增删改的功能。(另一个主要功能是数据隔离)
对于现有市场上不同的数据库来说,对于视图的增删改都不支持,或者说支持的很不好,有很多约束条件。
有人说过,产品功能是有限的,用户需求是无限的,真理。我遇见了有无限需求的客户。
先说一下用户大体需求:
我们的产品是一个智能开发平台,客户使用可视化的方式可以定义表单和流程,使用零编码的方式就可以快速开发出一套信息化管理系统。这种方式一直运行的很好,直到有一天。
客户:我们有一个系统是c/s结构的,想改成b/s结构,用你们的平台能做吗?
我: 可以啊,非常快。
客户:我看了你们的视频介绍,基本都是一个表单一个数据表对应的,但是我们的系统有时候一个表单要对应好几个数据表,这个怎么办呀?
我:用视图功能来定义表单就可以。
客户:我试了,视图功能只能查看,不能新增和修改啊
。。。。。(确实如此)
其实,在产品的研发和使用中,一直都不断有客户提出过这样的需求,为此也丢失了不少客户,痛定思痛,不能再痛。于是,一个新的视图操作概念诞生了
基于视图的增删改查操作
-
前言:
本文中所有操作都采用图形界面的方式完成,并不涉及到任何程序编写。所以,即使您不懂程序,也没有关系。
-
基本概念
-
- 视图:不用多做解释,知道的都清楚,不知道的查书。
- 基础表:本文的基础表和大家理解的基础表有一点区别。大家理解的或者书本上介绍的基础表指的是实际的物理数据表,本文的基础表指的是视图所依赖的实际物理表或者视图。(有点绕,因为视图可以再次通过“视图”的功能进行数据重组)。所以本文中只要视图引用的表或者视图,都叫基础表
- 物理表:数据库中真实的表
-
场景
基于视图的增删改操作,他不是提供一个接口工具,让您输入sql语句来完成,而是提供一个图形界面,通过 视图定义来自定生成操作界面,在操作界面进行新增、修改、删除和查询功能。在用户对视图进行增删改查操作时,后台运行的是视图分析引擎,所有的视图操作都交给视图引擎来完成。
-
实现原理
原理并不复杂,一句话,所有对视图的增删改查操作,都通过视图引擎和表单引擎转化到视图对应的基础表的操作(如果基础表本身也是视图,那么就递归进行转化,直到找到最后的物理表)。
所有真理都是简单明了的,但要证明他,确实非常复杂的一件事情。视图引擎和表单引擎就是如此。特别是当视图对应的基础表之间有外键关系时,要维护外键关系(同时添加,补充增加等)需要很多细心地判断。
-
图形界面
1、视图定义
这里提供了一个向导式的视图构建,如果您熟悉sql语句,直接写视图的sql也可以。
第一步:选择基础表
第二步:选择需要的字段
第三步:设置表之间的关系:系统其实已经帮您做好了所选基础表的表之间的关联关系,您可以再次修改
2、生成视图界面(设计图)
视图sql语句构建好后,就可以生成视图了,系统会做两部分工作。
一个是根据输入的视图sql语句,在数据库中生成真实的视图。
另一个是生成针对这个视图进行的增删改查的界面。
下面是自动生成的设计界面(编辑界面)
3、视图界面调整
您可以在系统自动生成的设计界面上进行调整为更好看的界面,这里就不做调整了,直接使用系统生成的格式。
自动生成界面后,就可以在视图的编辑页面进行操作了
4、列表
这是自动生成的视图的列表界面,可以通过这个界面进行视图数据的增删改查、导出、统计等。
5、新增记录
这里需要说明一点,我们创建的视图是从两个基础表获取数据的,一个是用户表的登录名和姓名,另一个部门表的部门名称。所以新增数据的时候,要从当前界面取值,然后分别新增到对应的部门表和用户表,同时还是设置这两条数据之间的关联关系(“用户属于哪个部门”这个关系)
6、修改记录
修改界面和新增界面是相同的,修改的时候,也是要把用户修改的数据更新到对应的物理表中
7、删除记录
这里需要注意的是:删除的时候,只删除这个视图的主表(在本文的演示案例中,用户表就是这个视图的主表)对应的数据,而不能删除部门表的数据。在其他案例中,如果构成视图的基础表之间没有关联关系(主外键),那么就同时删除所有的基础物理表的数据。
-
技术细节(待续)
========================================================
比sharepoint更强大的表单功能,图形化的流程设计,与asp.net完美结合,支持vs.net编程扩展
========================================================