它们是怎么做数据持久化的
比如在界面上设置了一个个人信息表单,有 name,age,sex 三个字段,表单设计完也就有了数据模型,我的问题就是这些数据是如何保存并使用的,是 mongodb 或 mysql ?
感觉这个产品天然的就不适合用 mysql,每个人的表单都有不一样的字段,用关系型数据库成本太高,表单创建完是要使用的,那这个表单的 curd 该如何落地,这个数据模型对应到代码里是什么样子,个人认为不是个具体对象,代码对这个模型内容应该是无感知的
氚云
番茄表单
1
majiaxin110 2020-06-23 10:49:07 +08:00 1
意思是说表单的字段变动频繁,用户可以自由创建表单,为表单添加删除任意字段是吗?
|
2
kvkboy OP @majiaxin110 对的,v 站我不会发图片..可以看看氚云的文档 http://help.h3yun.com/#%E5%9F%BA%E7%A1%80%E6%8E%A7%E4%BB%B6
|
3
lonelymarried 2020-06-23 11:06:15 +08:00
这有点像 excel 啊。
我感觉还是一个表单对应一个表啊。 |
4
yannxia 2020-06-23 11:08:55 +08:00
题外话:一直觉得……这种东西就是 BPM,低代码感觉还是要生成代码的那种才像。
|
5
CrazyEight 2020-06-23 11:09:54 +08:00
我就是在做这种项目,用的就是 MySQL 。。
|
6
leoskey 2020-06-23 11:12:13 +08:00
关系型数据库使用 keyvalue 表形式存储配置,非关系型 redis 本身就是 keyvalue,mongodb 也很灵活
|
7
kvkboy OP @CrazyEight 一个表单一个表吗....那你是怎么存的,动态创建类持久化到 mysql 吗
|
8
kvkboy OP @lonelymarried 是有点像,大学生那种各种各样的问卷调查就是用这些平台比如 番茄表单 这样创建的,给他们一个平台,他们自己通过拖曳组件就可有创建相应的文本框、复选框。
一个表单对应一个表太重,而且不太好实现,表单是随时都能改变字段的,当然也可也制定规则创建了就不让改,主要难点还是这部分数据的 curd,如果是 mysql 创建表的话,表对应的持久化对象就不好弄... |
9
kvkboy OP @yannxia BPM 算个子集吧,包括了它,其实我都觉得就是无代码了.....通过组件排列组合给你来一个大学生意见调查表
|
10
lonelymarried 2020-06-23 11:36:39 +08:00
对,mongodb 比较适合这个
|
11
ss098 2020-06-23 11:49:32 +08:00
之前用 Alpaca.js ( jQuery )做过,数据库用 MySQL JSON 字段存储。
但 NoSQL 直接嵌套 BSON 存储会更好。 |
12
majiaxin110 2020-06-23 12:38:08 +08:00
那么应该考虑模型建立的时候对字段抽象,字段可以拥有表示类型的属性,或者采用继承关系表示多种字段。用户创建一个个性化表单则是多种字段的组合。也就是说,我觉得只要正确分析建模,底层数据库使用哪一种都是可以的。
|
13
mnssbe 2020-06-23 12:57:56 +08:00 1
数据库怎么用都没研究明白, 要做这个平台我看够呛
|
14
w7938940 2020-06-23 13:37:15 +08:00
推荐 Ruby 大佬的作品 [Form Core]( https://github.com/rails-engine/form_core)
https://ruby-china.org/topics/33098 |
15
tctc4869 2020-06-23 13:40:35 +08:00
楼主,低代码开发,要一步一步来,不要一口吃成一个胖子。
对于 Web 应用,先解决怎么低代码零代码开发后端,然后怎么做到兼顾低代码零代码开发的同时也能定制后端编码开发。 如果做到了 Web 后端低代码开发,再去考虑怎么低代码零代码开发前端。 |
17
kvkboy OP @tctc4869 你说的很对,确实是这样的,现在我也是刚进入这个需求中,在了解原理和探索一些设计中,试用了氚云和云枢后,我就在想如果要实现这个怎么搞,然后就有个疑问,想知道他们是怎么做到数据的建模和 curd 的
|
18
kvkboy OP @tctc4869 国内的低代码平台,不管怎么说都是新建应用,表单设计,数据建模开始,我不是想探讨哪个关键不关键,就是单纯的疑问他们是怎么做的,如果是我该怎么实现,这么一想下去,就会发现,数据这块是绕不开的,怎么 curd,结构是咋样
|
19
davidsu1314 2020-06-23 13:53:05 +08:00
这种场景 mongodb 比较适合吧
|
20
SakuraKuma 2020-06-23 13:59:13 +08:00
```json
{ componentType: fields:[{ id: val: label: }] } ``` 数据库用啥都行了,提交的时候根据 id 做 field name 处理就好。 |
21
yiyi11 2020-06-23 14:00:34 +08:00 via Android
我猜如果要用传统 db,就用 map 保存字段-字段信息的结构,然后转 json 存数据库,这里要考虑的就是大的 map,存取时,序列化 /反序列化的效率。
|
22
kvkboy OP @davidsu1314 我不太熟悉 mongodb,仅仅就是看过几篇文章,虽然我也觉得 mongodb 比较好也不知道好在哪,但是主要问题还数据实体该怎么办,mongodb 能做到没有实体类映射就能插入数据库吗
|
23
kvkboy OP @SakuraKuma 好像用 json 更方便点,然后 curd 就围绕着这个 json 结构进行操作是吗
|
24
kvkboy OP @ss098 对 mongodb 不是很熟,我发现它明明格式是用 BSON,然后我看了一些 springboot 使用 mongodb 的例子全是需要先创建实体,然后映射然后存储,这跟 mysql 有啥区别....能不能不需要这个实体类,直接就用这种结构进行 curd
|
25
lonelymarried 2020-06-23 14:16:21 +08:00
用 node 写 mongodb,直接写 json,比 java 方便
|
26
SakuraKuma 2020-06-23 14:16:31 +08:00
@kvkboy 存的方式随意呀, 你可以拆开组件和字段, 两个表(mysql), 也可以一个 json 直接 mongo.
当然 mysql 5.7 后直接支持 json 了. |
27
kvkboy OP @kvkboy 被三流文章陷害的我,老子还在想明明是 nosql,为啥整合起来全是创建实体类,映射,然后 curd,这特码跟 mysql 啥区别
|
28
no1xsyzy 2020-06-23 14:30:32 +08:00
MySQL 每张表可以拥有不同的字段,但它本身是可以被 SQL 语句取出的。
方法就是转置,行向量变列向量。 Threestore 类或者 SICP 讲 query 的那章看完,就可以了,没有本质区别,只是方便与否的问题。 但确实 JSON 结构存储的话建模会方便点。 |
29
lijialong1313 2020-06-23 14:35:16 +08:00
如果你要 crud 落地的话,可以参考一点点我这个思路
例如一个单选框,我数据库这么存。 1.类型表:单选、多选、输入 2.选项表省略 3.实际类型(问题)信息表,省略 4.2 、3 的关联,省略 5.用户数据表。用户在当前问题中的选项。比如对于问题 1,它的选项是 3,那存储的就是:user-1-3 这个类似是数据库第三范式,以用户、题目作为主键。 一个用户的一个题目只有一个答案(答案类型不唯一,例如可以是选项 ABC,也可以是文字的填写) 问题可以通过变更类型表,变更识别方式,例如使用单选的时候执行单选逻辑,多选的时候执行多选逻辑。所有存储都存储到用户数据表。 如果表单发生更替,直接认为是重建一张新问卷。 |
30
tctc4869 2020-06-23 14:38:57 +08:00
@kvkboy
web 应用,后端低代码开发的基本前提并不是数据,数据持久化方案,最低级的用 txt 里面存 json,xml 就可以搞,标准一点 sqlite 。至于什么 MongoDB,mysql 这些不过是更高级的方式。选什么数据库就看你的了,数据就是用来抽象业务的。 最关键的基本前提,就是 Web 后端的请求处理配置。如果搞定了这个,再去考虑什么数据建模,表单设计等高级低代码开发功能。这些都是在搞定基本前提之后才考虑的问题。数据建模,如果搞不定 Web 后端的请求处理配置,就别谈什么数据建模,表单设计这些高级的低代码开发。 当然也可以从代码生成器入手,但是如果一个 web 应用的低代码开发平台仅靠代码生成器为核心来开发应用,那是最不行的。想靠代码生成器开发稍微复杂的 web 端应用(这里同时包括前端与后端),那是痴人说梦。 |
31
clf 2020-06-23 14:44:39 +08:00
mongo 和 mysql 都可以存储。
处理的时候全在前端实现数据的修改逻辑就可以了,然后“覆盖”原来的数据。需要历史版本的话新插入一条,把原来的数据状态改为 old,新旧数据有一个字段用来标致是同个表单的。(之前我是这么做的) |
32
CrazyEight 2020-06-23 14:48:22 +08:00
@kvkboy 一个表单对应一个表,直接用 jdbcTemplate 动态的生成 sql 语句,保存表单数据那块没有用 orm 框架
|
33
ConradG 2020-06-23 14:53:37 +08:00
表单不就是一个树么,树有啥不好存的。
|
34
zjsxwc 2020-06-23 14:57:22 +08:00
一个页面对应一个 Class 类,页面数据对应这个类实例 Instance,
至于对每个实例存储方式就各种各样了,楼上说的方法很多, 也就如何把拖拽出的表单页面转换为 Class 类代码,有点意思吧。 |
35
oahebky 2020-06-23 14:59:17 +08:00
这些平台思路很强。
小规模公司低成本专业化( EPR ),是符合生产力的发展路线。 |
36
tinyuu 2020-06-23 15:01:33 +08:00
一个结构表(form_definition)存 表单相关信息 如名称,字段列表,等
设计器保存表单信息到 form_definition 表中。 然后每个表单创建一个表。 前台查询等时候就是按名称找 form_definition 然后拼接 sql 。 |
37
ty89 2020-06-23 15:05:35 +08:00
花点时间深入学习一下数据库表设计,比跑这里问怎么实现有意义的多.
|
38
kvkboy OP @tctc4869 多谢解答,能不能告诉我下 Web 后端的请求处理配置 是指什么,按照我的理解其实低平台就是制定一套规则,然后后端用一种“通用语言”解析用户的行为,你说的请求处理配置,是不是就指这部分解析
|
39
kvkboy OP @oahebky 哈哈哈,其实我第一反应也是这个做法,思考如何解析页面元素动态创建 class,然后发现技不如人,溜了溜了
|
40
guoyang 2020-06-23 16:33:27 +08:00 1
@kvkboy 看下 salesforce 的设计,将表的设计作为元数据,数据抽象通用存储模型,具体细节见如下链接:
https://www.slideshare.net/developerforce/salesforce-multitenant-architecture-how-we-do-the-magic-we-do |
42
tctc4869 2020-06-23 17:58:49 +08:00
@kvkboy 你说的我不理解,我那个回复的意思也不是搞什么新的“通用语言”。你想要以零代码和低代码的成本开发一个 web 应用。
首先如果你想要的开发低代码开发平台。你要先解决后端的 Web 请求配置问题。你要先做到以零代码的方式配置配置 Web 请求处理 Action (这里要求的是零代码配置哦),这就是最基础关键的地方哦,虽然这个地方与数据建模,表达设计等高级低代码开发是无关的,但却是它们实现的基础。如果没有这种基础,就算有数据建模,表达设计,也终究不过是代码生成。这样做的低代码开发就没有任何意义。 重点:以零代码的方式配置配置 Web 请求处理 Action 。至于怎么做,就得看你选择的 WebMVC 框架,你得在入站处理方法进行定制,以达到零代码配置 Action 目的。 |
43
zjsxwc 2020-06-23 21:44:29 +08:00 via Android
@kvkboy #39 原文:“@oahebky 哈哈哈,其实我第一反应也是这个做法,思考如何解析页面元素动态创建 class,然后发现技不如人,溜了溜了”
回复: 站在别人的肩膀上也简单,网上很多拖拽生成 html 的例子直接拿来用,比如 bootstrap 那套,然后把 html 提交到服务器,再直接用现成的 html parser,把传过来的 html 表单转换为 class 定义代码就行。 |
44
cornelia 2020-06-23 21:47:41 +08:00
关于低代码平台我看过最好的一篇文章: https://github.com/CntChen/cntchen.github.io/issues/15
|
45
lonelymarried 2020-06-24 08:47:52 +08:00
@cornelia 为什么 Data 表要有这么多 value,不是一条 value 对应一条记录么
|
46
ty89 2020-06-24 12:48:25 +08:00
@ShareManT 伸手党就是伸手党,能发出来还不能让人说了,玻璃心就别上网冲浪。恨不得有人一步步告诉代码要怎么写 , 根本问题不是不知道怎么实现动态字段,而是对数据库的理解只停留在了 curd 的层面,不去解决更不问题深入学习数据库,只一个劲的问怎么实现怎么实现, 明天遇到个其他需求,还是一样的不会,还是会跑过来发帖,如此循环。自己抽点时间下功夫研究一下是会死还是会怎样。高不高人一等我不知道,但是我知道我绝对不会招聘类似这样的人。
|
47
kvkboy OP @ty89
我又变成伸手党了? 扣帽子倒是扣的比谁都厉害啊,玻璃心不能上网,你这种杠精就能了?请问您是哪一家公司的 HR 还是领导,说出来让大家避嫌。 你家着火还是发水,我遇到问题想集思广益问问大家想法,我是让你用嘴巴敲键盘打一个代码了还是耽误你每分钟百万的薪资了,上来嘴巴臭就开始喷还敢这么自信?你懂就懂不懂就不懂,你一定找骂何必呢,自己爽🐎却没了又恶心大家。 而且哪知眼睛看到我要问怎么实现,我求你用你嘴巴敲键盘了还是什么,不爱看你还点进来,你贱不贱,都陌生人一定要爽一下彰显什么呢? 我遇到疑惑发现没什么好思路,发帖让大家帮我拓宽一下思维,技术交流都能被你说的这么不堪入目,那我建议你以后远离网站,远离 github,远离开源,你为什么不下哭功夫去研究以下是会死还是会怎么样? 希望您在公司顺风顺水,步步升高,高人一等 |
48
kvkboy OP 我他妈就不理解了,我碰到一个问题,想知道答案或者思路而已,你懂就懂,热心的就帮帮我,不懂就略过就好了。
提问->解答,就这么单线的剧情,一定要杠杠杠,杠你🐎杠。 本来你一天的好心情一定要刺激我这个十级喷子喷一顿,然后自己受不了这个气,一天都没了,何必呢。 |
49
tctc4869 2020-06-24 14:16:12 +08:00
@kvkboy 我给楼主波点冷水把。楼主,如果你想要实现“在线的低代码开发平台。开发完后直接线上部署,可以开发部署多个实例,无需关心后端前端数据库,只需考虑页面托拉拽设计,表单设计,数据建模等”,这种程度的低代码开发平台,那难度可高了,可以称为 aPaaS 级别应用。这可不是单单是数据库的问题。你可以搜一下 aPaaS 是什么意思。
楼主,如果你想做这种程度的低代码开发,那你要做的东西可多了。 |
50
kvkboy OP @tctc4869
是有点这个意思,但不是说一开始就要这么高级别,数据中台和业务中台我们都有了(虽然挺破),我不太懂我们 leader 想法是怎么样,我只是进入这个项目,先开始整体的考虑,要求现在只是就是先打一个底子,先给内部业务人员使用,一些简单的管理 OA 系统、审批流程、问卷调查就通过这个平台让产品或业务人员自己通过拖拉组件设计,使用 |
51
kvkboy OP @tctc4869
这玩意我用了氚云和那个钉钉云枢之后,我就发现,很难了很难了,是个难度很高的平台级别的产品,具体肯定是要交给大佬们考虑了,问题不大我只是个默默无闻的小搬砖,只是好奇他们这种的设计思路是什么样的,先整体了解一下 |
52
tctc4869 2020-06-24 14:55:43 +08:00
你要先从后端开始,你先不要考虑前端的问题,所以表单托拉拽,数据建模设计这个先扔在一边,还有数据库也扔一边去。
你先做到后端零代码开发。没有数据库也可以做,只不过实现的功能很少,但是至少实现后端零代码开发后,那么低代码开发的最根本基础是搭建好了。然后再去考虑数据库,表单托拉拽,数据建模这些高级的问题。后端零代码开发的关键就是 WebMVC 那一块配置。 |
54
kvkboy OP |
55
tctc4869 2020-06-24 17:35:16 +08:00
@kvkboy 关于 http 测试工具,你想想为什么只有 http 客户端模拟测试工具软件,http 服务端模拟工具软件一个都没有呢。
|
56
tctc4869 2020-06-26 18:42:18 +08:00 via Android
@kvkboy 你的第一步就是重新设计一个 MVC 框架,这不是减少代码量的 mvc 框架,是为了零代码配置 mvc 而设计的 mvc 框架。
|
57
cloudhuang 2021-04-08 17:50:08 +08:00
具体的什么数据库,如何存储,其实从大的角度聊不出什么来,要么关系型数据库,但是大体上直接存 JSON,比如某软的 SharePoint,直接大字段存 XML,或者 NoSQL 这种 schemaless 的方式,初期比较简单。
我觉得两个层面的问题是值得讨论的: 1. 前端表单和后端对象(表格)的绑定问题 2. 如何做多租户 不知道楼主现在的实现是如何的? |
58
ideal1412 2021-08-12 12:18:22 +08:00
有思路可以给楼主借鉴一下,我做 salesforce 开发几年了,salesforce Paas 平台应该是全球最强的。里面一个关键概念就是元数据,描述数据的数据。比如说前端数据建模设计,最后都是元数据,只不过是描述数据本身的一种数据。所以你要做的是,如果表示,存储,和渲染元数据
|