有没有可能把一个数据库的 text field 变成可拓展、易阅读的数据格式?

2022-11-05 09:47:21 +08:00
 nowheremanx
和另一个部门对接的时候,经常因为业务需求的改变,需要增加或者修改数据库的 field 。

比如 People 这个 table ,原先 firstName, lastName ;后来要增加学历,就增加了一个 education ;后来需要 tag ,就让对方加了一个 tag 表等等。

每次增加 feature 都要等挺久的,所以想申请一个 TEXT field ,然后自己定一个数据格式进行存储。一般来说都希望用 JSON ,但是很多用户喜欢在网页上修改,所以 JSON 这个格式不太自由,也不好阅读。本来 XML 这种格式不错,但是特殊符号的处理很麻烦,比如“<>”也不可能让用户边查边写。

目前想到的是 TOML 格式,支持很多数据类型,也支持 comment 。

====
一些自由文本
{start indicator}
“TOML 文本”
[basic]
fisrtName = "小明"
lastName = "王"

[advanced]
tags = ["程序员", “大牛”]
# 学历可能不准确,稍后校对
education = ["北大青鸟", "山东蓝翔"]
travel = "Beijing <> Shanghai"
{end indicator}
一些自由文本
====

这样一来,我在后台处理的时候,可以根据 indicator 截取 TOML 文本,并转换成 JSON 这类通用格式。如此一来,序列化、反序列化都容易实现。 自由文本则是留给用户,有更多修改余地。


不知道这样做有没有坑,或者还有没有更好的数据格式?
2238 次点击
所在节点    程序员
21 条回复
yannxia
2022-11-05 09:51:00 +08:00
可能需要的是一个 mongodb
nowheremanx
2022-11-05 09:54:18 +08:00
@yannxia 最大的问题在用户那里,用户在网页上是用 text area 编辑的,不是富文本,我也没办法帮忙改造。需要一个非常清晰的数据结构让用户去输入(很多用户不是程序员)。
ospider
2022-11-05 09:58:17 +08:00
xy 问题,还好你把前因后果都说明白了。需要改的不是数据库,更重要的是增加一个类似 react-jsonschema-form 这种从 schema 自动生成表单的工具。
SuperMild
2022-11-05 09:59:09 +08:00
看你说的情景,貌似用户量不会很大,用 TOML 也可行。

但不建议直接让普通用户自己操作 TOML ,好歹弄个网页表单让他们填。新增 field 应该有一个申请过程,日常使用还是要固定 field 的。
wxf666
2022-11-05 09:59:37 +08:00
奇怪,不能动态构造有 firstName, lastName, education, tag, travel, …… 等字段的表单,给用户填写吗?

用户提交后,后端再转成 json ,写进数据库。。

好像不难啊?
renmu
2022-11-05 10:05:21 +08:00
然后客户说我们要根据这个字段做筛选,做排序
wxf666
2022-11-05 10:13:35 +08:00
@renmu MySQL 好像可以给 json 字段做索引吧?连数组也能做索引( multi-valued Indexes )
locochen
2022-11-05 10:20:26 +08:00
纵表可以试一下
nowheremanx
2022-11-05 10:22:18 +08:00
@SuperMild 是的,都是内部用户。 主要我也管不了那个网页平台,不然也不用费神改造这个 field 了。

现在这个想法就是让用户、我这边的脚本( oop )联通,既可以通过 oop 修改,又可以在网页上直接修改。
脚本:
user.tags.append("管理员")
user.save() # 山寨 orm ,toml dict 转成 toml text ,还原自由文本,然后把整个文本作为一个 field ,通过 api 更新。
用户:
直接在 tags 里面通过网页填写。 就算格式填写错了(比如 tags 填了 1 这种数字),每天跑一遍数据库检查并发送 email 提示也是没问题的。

除此之外,另外一个部门也可以用我的代码进行 BI 分析,比如公司内部有多少北大青鸟毕业生。
len([user for user in users if "北大青鸟" in user.education])
nowheremanx
2022-11-05 10:34:53 +08:00
@ospider 你好,我应该算是乙方。。。网页的前端、后台我都没有办法修改,我只是用那个平台。每次叫对方部门增加一些 feature ,我都要等很久,所以想自己做一套类似于 virtual field 的东西。
wxf666
2022-11-05 11:07:39 +08:00
@nowheremanx 会不会『希望用户能老老实实填写正确的 `toml`』有点不现实?

比如,会不会出现:

- 不小心删掉了一点 `{indicator}`,导致你没法定位
- 写成了中文符号 *(`tags = [“程序员”,“大牛”] `)*
- 没正确转义字符串 *(`path = "C:\users\toml\Desktop\new\使用"的注意事项.docx"`)*
- 输错键名 *(`tag = ...`)*
- ……
oldshensheep
2022-11-05 11:27:16 +08:00
>> 网页的前端、后台我都没有办法修改。
后台返回一个 javascript 代码,前端运行
tramm
2022-11-05 15:56:04 +08:00
那个字段用 JSON 格式嘛 :P
totoro52
2022-11-05 17:22:26 +08:00
你直接说我要一个自定义字段的功能不就行了。。 这种需求基于在 B 端系统在常见了,我的建议是拿一个字段表和字段数据表去记录真实的数据。。,JSON 到后期你想改造加需求你回发现越来越难
我做过这个需求,我的做法就是按照我上面说的, 而且还可以搜索排序各种方式,不过我是写入到 ES 里的 所以 mysql 只是拿来村数据
totoro52
2022-11-05 17:27:27 +08:00
我做过的 B 端基于全部都有这个需求, 有的甚至更变态,
所有的模块需要全部支持自定义新增字段,这个字段还要参与排序, 检索
甚至还要参与导出到 execl , 同时还要支持表头自定义
我甚至写一个更离谱的需求,各个模块某些字段是有联动性的,比如 A 模块有个联系人,B 模块在选 A 模块列表数据时,需要把 B 模块的联系人自动填写进去,也就是等于各个模块的自定义字段可以相互传递, 什么变态的需求都过来了
akira
2022-11-05 18:07:34 +08:00
不是很建议这么折腾。。你应该是想办法推进 加快 feature 需要的时间,而不是自己另外搞一套东西嵌上去
wxf666
2022-11-06 00:45:35 +08:00
@totoro52 数据库新手请教一下,如果是用 `MySQL` 实现的话,这个 `字段数据表` 结构是咋样的呢?

`( ID PRIMARY KEY ,所属记录 ID ,字段 ID ,数据 TEXT ,INDEX (所属记录 ID ,字段 ID ))` 这样?

检索,用全文索引?

排序。。是啥。。


> 比如 A 模块有个联系人,B 模块在选 A 模块列表数据时,需要把 B 模块的联系人自动填写进去

(可能没理解透功能)直接 JOIN 能解决吗?
xuanbg
2022-11-06 07:29:48 +08:00
如果 OP 你所谓的字段与业务逻辑无关的话,写成:
fisrtName:小明
lastName:王
tags:程序员、大牛
这样的文本难道不利于阅读吗?
totoro52
2022-11-06 10:07:59 +08:00
@wxf666
一个字段表,记录所有新增的字段,字段的属性类型等等
一个字段数据表,记录字段的新增的数据,所属哪条数据和字段
nowheremanx
2022-11-06 10:29:14 +08:00
@xuanbg 我这边需要序列化 /反序列化和数据处理的。参见 9L 发言。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/892842

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX