有没有可能把一个数据库的 text field 变成可拓展、易阅读的数据格式? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
nowheremanx
V2EX    程序员

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

  •  
  •   nowheremanx 2022-11-05 09:47:21 +08:00 2616 次点击
    这是一个创建于 1122 天前的主题,其中的信息可能已经有所发展或是发生改变。
    和另一个部门对接的时候,经常因为业务需求的改变,需要增加或者修改数据库的 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 这类通用格式。如此一来,序列化、反序列化都容易实现。 自由文本则是留给用户,有更多修改余地。


    不知道这样做有没有坑,或者还有没有更好的数据格式?
    第 1 条附言    2022-11-05 12:25:44 +08:00
    补充一下,我没办法动网页的前后端,我只是网页的使用者。整个项目的目的,就是把一个 form 的 text field 通过一定的数据结构改造成可拓展、易阅读。最低要求就是 key-value 。

    我说的后台是对网页 API 的操作,我自己写了个客户端去操作 API ,所以类似 ORM 。我可以把这个 text field 特化成特定模型,这个没问题。

    如果只是我去操作这个 field ,说实话 json 都可以;问题在于不少用户不会写代码,需要去网页里进行修改数据。楼下说的误操作、特殊字符等,确实是问题。综合考虑 toml 比较合适,但还是不太完满,所以过来请教一下。
    21 条回复    2022-11-06 10:31:58 +08:00
    yannxia
        1
    yannxia  
       2022-11-05 09:51:00 +08:00   1
    可能需要的是一个 mongodb
    nowheremanx
        2
    nowheremanx  
    OP
       2022-11-05 09:54:18 +08:00
    @yannxia 最大的问题在用户那里,用户在网页上是用 text area 编辑的,不是富文本,我也没办法帮忙改造。需要一个非常清晰的数据结构让用户去输入(很多用户不是程序员)。
    4BVL25L90W260T9U
        3
    4BVL25L90W260T9U  
       2022-11-05 09:58:17 +08:00
    xy 问题,还好你把前因后果都说明白了。需要改的不是数据库,更重要的是增加一个类似 react-jsonschema-form 这种从 schema 自动生成表单的工具。
    SuperMild
        4
    SuperMild  
       2022-11-05 09:59:09 +08:00
    看你说的情景,貌似用户量不会很大,用 TOML 也可行。

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

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

    好像不难啊?
    renmu
        6
    renmu  
       2022-11-05 10:05:21 +08:00 via Android
    然后客户说我们要根据这个字段做筛选,做排序
    wxf666
        7
    wxf666  
       2022-11-05 10:13:35 +08:00
    @renmu MySQL 好像可以给 json 字段做索引吧?连数组也能做索引( multi-valued Indexes )
    locochen
        8
    locochen  
       2022-11-05 10:20:26 +08:00 via iPhone
    纵表可以试一下
    nowheremanx
        9
    nowheremanx  
    OP
       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
        10
    nowheremanx  
    OP
       2022-11-05 10:34:53 +08:00
    @ospider 你好,我应该算是乙方。。。网页的前端、后台我都没有办法修改,我只是用那个平台。每次叫对方部门增加一些 feature ,我都要等很久,所以想自己做一套类似于 virtual field 的东西。
    wxf666
        11
    wxf666  
       2022-11-05 11:07:39 +08:00   1
    @nowheremanx 会不会『希望用户能老老实实填写正确的 `toml`』有点不现实?

    比如,会不会出现:

    - 不小心删掉了一点 `{indicator}`,导致你没法定位
    - 写成了中文符号 *(`tags = [“程序员”,“大牛”] `)*
    - 没正确转义字符串 *(`path = "C:\users\toml\Desktop\new\使用"的注意事项.docx"`)*
    - 输错键名 *(`tag = ...`)*
    - ……
    oldshensheep
        12
    oldshensheep  
       2022-11-05 11:27:16+08:00 via Android
    >> 网页的前端、后台我都没有办法修改。
    后台返回一个 Javascript 代码,前端运行
    tramm
        13
    tramm  
       2022-11-05 15:56:04 +08:00
    那个字段用 JSON 格式嘛 :P
    MIUIOS
        14
    MIUIOS  
       2022-11-05 17:22:26 +08:00
    你直接说我要一个自定义字段的功能不就行了。。 这种需求基于在 B 端系统在常见了,我的建议是拿一个字段表和字段数据表去记录真实的数据。。,JSON 到后期你想改造加需求你回发现越来越难
    我做过这个需求,我的做法就是按照我上面说的, 而且还可以搜索排序各种方式,不过我是写入到 ES 里的 所以 mysql 只是拿来村数据
    MIUIOS
        15
    MIUIOS  
       2022-11-05 17:27:27 +08:00
    我做过的 B 端基于全部都有这个需求, 有的甚至更变态,
    所有的模块需要全部支持自定义新增字段,这个字段还要参与排序, 检索
    甚至还要参与导出到 execl , 同时还要支持表头自定义
    我甚至写一个更离谱的需求,各个模块某些字段是有联动性的,比如 A 模块有个联系人,B 模块在选 A 模块列表数据时,需要把 B 模块的联系人自动填写进去,也就是等于各个模块的自定义字段可以相互传递, 什么变态的需求都过来了
    akira
        16
    akira  
       2022-11-05 18:07:34 +08:00
    不是很建议这么折腾。。你应该是想办法推进 加快 feature 需要的时间,而不是自己另外搞一套东西嵌上去
    wxf666
        17
    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
        18
    xuanbg  
       2022-11-06 07:29:48 +08:00
    如果 OP 你所谓的字段与业务逻辑无关的话,写成:
    fisrtName:小明
    lastName:王
    tags:程序员、大牛
    这样的文本难道不利于阅读吗?
    MIUIOS
        19
    MIUIOS  
       2022-11-06 10:07:59 +08:00
    @wxf666
    一个字段表,记录所有新增的字段,字段的属性类型等等
    一个字段数据表,记录字段的新增的数据,所属哪条数据和字段
    nowheremanx
        20
    nowheremanx  
    OP
       2022-11-06 10:29:14 +08:00
    @xuanbg 我这边需要序列化 /反序列化和数据处理的。参见 9L 发言。
    nowheremanx
        21
    nowheremanx  
    OP
       2022-11-06 10:31:58 +08:00
    @akira 确实是一个很大的坑,也不 elegant 。同时,我也担心未来业务和代码搭建在这上面会带来很多风险,那就属于重大决策失误了。

    这个小项目也是在构思阶段,过来问问主要想看有没有成熟的解决方案。 目前为止没看到合适的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5275 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 07:13 PVG 15:13 LAX 23:13 JFK 02:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86