V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nowheremanx
V2EX  ›  程序员

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

  •  
  •   nowheremanx · 2022-11-05 09:47:21 +08:00 · 2209 次点击
    这是一个创建于 749 天前的主题,其中的信息可能已经有所发展或是发生改变。
    和另一个部门对接的时候,经常因为业务需求的改变,需要增加或者修改数据库的 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 编辑的,不是富文本,我也没办法帮忙改造。需要一个非常清晰的数据结构让用户去输入(很多用户不是程序员)。
    ospider
        3
    ospider  
       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
    totoro52
        14
    totoro52  
       2022-11-05 17:22:26 +08:00
    你直接说我要一个自定义字段的功能不就行了。。 这种需求基于在 B 端系统在常见了,我的建议是拿一个字段表和字段数据表去记录真实的数据。。,JSON 到后期你想改造加需求你回发现越来越难
    我做过这个需求,我的做法就是按照我上面说的, 而且还可以搜索排序各种方式,不过我是写入到 ES 里的 所以 mysql 只是拿来村数据
    totoro52
        15
    totoro52  
       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:程序员、大牛
    这样的文本难道不利于阅读吗?
    totoro52
        19
    totoro52  
       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   ·   实用小工具   ·   917 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 22:02 · PVG 06:02 · LAX 14:02 · JFK 17:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.