动态表单的数据库结构设计

利用在线编辑器设计的表单,包含输入框,明细表(动态添加行)等需要存储到数据库的信息,现在有三种思路:

1.一个表单对应数据库的一张或多张物理表(主从表),这种设计在很多业务的情况下,其数据库的物理表会不断膨胀,同时,当修改表单时,其对应的物理表结构也需要修改,当物理表很多数据时,改变物理表scheme会锁表,导致在线应用访问这些表。

2.利用横向表纵向存储的思路,即一张物理表保存的是所有表单对应的字段信息和对应的值,这样的好处就是扩展表单(如添加一个字段)时只需要往这样表插入一条数据,但随着表单的增加,这张表的信息量将成倍数级增长,同时对后边数据的呈现,数据的统计查询造成很大影响。

3.利用现在的无scheme数据库及nosql数据库进行表单字段及值(key:value)的存储,这样修改表单很方便,但对于数据存储每次都需要解析html有哪些字段(key)需要存储到数据库,还有其值是什么,同时,对于后面的数据统计,报表展现也难以实现,因为向mongodb这样的数据库,对数据统计的功能还是非常弱的。

有哪位大牛做过类似的动态表单设计器,可以说一下你的实现思路吗?

讨论一

第一种方式就当做没发生过吧
第三种的话其实是不错的方式,接触过类似的国外站点,完全基于nosql的数据库,方便扩展,很多高级的数据库对报表支持也不弱
第二种方式可以稍微细致说一说,很多市面上的自定义报表软件或者工具都是基于此设计的,曾经做过相关项目,对复杂表单的支持稍微弱一点,基础表单还是没有问题的,设计模仿数据库的设计,定义表(CustomTableConfig),定义表字段(CustomTableFieldConfig),然后有一张实例表(TableInstance)和实例属性表(tableFiledInstance),fieldInstance指向TableInstance和fiedConfig,fiedConfig和tableInstance指向tableConfig,field要有字段类型,字段名称,字段长度,字段编号等属性,可以扩展自动更新和ID自增长等属性。表实例其实就相当于表的记录了。可以针对这个设计对crud进行一定封装,已达到与数据库操作相一致的效果。如果要扩展关联表,楼主可以进一步创建一个外键配置表和一个外键实例表,不过支持复杂表结构的话,上面提到的封装会复杂许多

讨论二

有一种方案,类似你的第二种方式吧,但是也有缺点。准备两张表。一张用来做横表,表A,扩展表单时(如添加一个字段),就往这表里插入一条数据。
另一张表。表B,用来正常存储数据,字段名不再是和业务有关的,全部用类似key1,key2,key3……等等,和表A中表单field name一一对应,表2的列可以预先准备n列,如果表2的列不够用了,再在程序中动态添加m列。

先说优点吧,相比你第一个方案,大大减少了修改表结构的次数,甚至预先准备的列够用的话,不需要修改表结构了。然后由于存储数据的表2依然是常见的关系型结构,所以对于数据统计查询的核心sql不会造成影响。

特别提到核心sql不受影响,因为这个方案缺点也很明显。每次查询都要做一个从表A到表B的关联。先从表A从获取你想select的表名,以及哪些key1, key2, key5, key6 。。。  然后根据这些从表2中拿数据。还是有点小麻烦的。

原文地址:https://www.iteye.com/problems/91934

posted @ 2019-10-17 15:26  星朝  阅读(10398)  评论(1编辑  收藏  举报