自定义字段的功能数据库是怎么设计的呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
clockwork1122
V2EX    问与答

自定义字段的功能数据库是怎么设计的呢?

  •  1
     
  •   clockwork1122 2022-11-15 16:07:18 +08:00 2662 次点击
    这是一个创建于 1140 天前的主题,其中的信息可能已经有所发展或是发生改变。
    业务中开发了个设施巡检系统,功能只是记录对种类不同的设备进行记录。例如消防拴可能 5 个属性,然后闸门是 7 个属性。如果描述不清楚,同样的需求在 OA 平台、问卷系统、低代码平台很常有,想了解下一般实现方案。


    目前想到有几种方案:
    1. 一种类型一个数据表
    2. 一个数量极大的数据表,使用 type 区分,另外一张表存每个 type 具体的属性
    3. 一个数据表,使用 mysql8 的 json 类型
    第 1 条附言    2022-11-16 09:26:40 +08:00
    很感谢各位老哥的回复,好好研究大家的回复,学得不少,汇总下情况:
    1. 使用 mysql 搭配 json 格式
    2. 使用 mysql 搭配 EVA 设计
    3. 使用 mongodb
    19 条回复    2022-11-19 16:42:09 +08:00
    tool2d
        1
    tool2d  
       2022-11-15 16:12:12 +08:00
    我看到过别人设计的 sql 系统,都是用单独一个表格,设计可变动的字段。虽然我个人觉得动态改改表结构,也没啥问题来着。
    28Sv0ngQfIE7Yloe
        2
    28Sv0ngQfIE7Yloe  
       2022-11-15 16:12:49 +08:00
    这属于打 Tag 了吧?
    K7TrSJryPNjj
        3
    K7TrSJryPNjj  
       2022-11-15 16:17:23 +08:00
    EAV
    ztxcccc
        4
    ztxcccc  
       2022-11-15 16:23:46 +08:00
    想想 CMS 是如何让用户定制字段的
    clockwork1122
        5
    clockwork1122  
    OP
       2022-11-15 16:24:41 +08:00
    @tool2d 动态改表结构意味着需要改代码,例如是做 OA 平台,有 10 个公司,每个公司都有自己的模版,就太累了
    clockwork1122
        6
    clockwork1122  
    OP
       2022-11-15 16:30:15 +08:00
    @ztxcccc 没接触过 CMS 系统,是我认识不准确吗,内容发布一般就标题、内容、之类的,字段还比较固定吧,觉得问卷调查系统更贴合需求
    clockwork1122
        7
    clockwork1122  
    OP
       2022-11-15 16:30:26 +08:00
    @Morii 不是吧
    clockwork1122
        8
    clockwork1122  
    OP
       2022-11-15 16:30:39 +08:00
    @K7TrSJryPNjj 谢老哥,我查查
    RoninZc
        9
    RoninZc  
       2022-11-15 17:35:54 +08:00
    http://jintang.zone/2021/08/31/%e5%8a%a8%e6%80%81%e5%ad%97%e6%ae%b5%e5%ad%98%e5%82%a8%e6%96%b9%e6%a1%88%e5%af%b9%e6%af%94.html
    a546016387
        10
    a546016387  
       2022-11-15 18:07:24 +08:00
    @RoninZc #9 老哥博客是啥主题,挺好看的
    clockwork1122
        11
    clockwork1122  
    OP
       2022-11-15 18:49:49 +08:00
    @RoninZc 感谢老哥
    optional
        12
    optional  
       2022-11-15 19:38:27 +08:00
    你的需求那么明确了(类型对应固定的字段集合),那显然 json 是最合适的。
    查询的时候,直接 type=? AND attrs->'?' == ? 就好(这里用 pg 的语法)
    zxfreedom
        13
    zxfreedom  
       2022-11-15 19:42:01 +08:00
    同楼上,可以用 json 试试
    8rmEHZ8WhVHVOb0E
        14
    8rmEHZ8WhVHVOb0E  
       2022-11-15 19:53:28 +08:00
    用 Nosql ,比如 MongoDB 就是专门搞这种的,每条数据属性都可以不同
    wbrobot
        15
    wbrobot  
       2022-11-15 20:26:11 +08:00
    @tool2d
    直接用开源的无头 cms 啊, 如 directus 以前是 php 后端,现在全 nodejs 了, 还有 strapi 等等
    或者类似的数据集管理库,如 supabase, 还有 go 开发的宣称单运行文件为特色的 pocketbase

    如果要自己开发,就参考开源实现,很多啊
    securityCoding
        16
    securityCoding  
       2022-11-15 22:06:10 +08:00
    推荐用 mongo 之类的,用 mysql 纯属是找不自在
    flankerfc
        17
    flankerfc  
       2022-11-15 22:31:25 +08:00
    你的类型有多少。mongodb 肯定可以解决,mongodb 本身就是 document 数据库,没有 schema ,性能也足够。但是你需要有一套成熟的 ORM 框架。还有如果用 mongodb 你也要考虑到和其他数据表的 relation 。如果你已经很熟悉 mysql 或者 psql 了,用 json 类型其实也可以。或者就是单独一个表来保存扩展属性( key/value 的形式),这种就是读取数据时,要 join 联查出来
    RoninZc
        18
    RoninZc  
       2022-11-16 09:54:58 +08:00
    @a546016387 @clockwork1122 网上冲浪找的博客,主题是啥我也不知道
    hperfect
        19
    hperfect  
       2022-11-19 16:42:09 +08:00
    postgresql 的表继承方案也可以了解一下, 我们公司用的就是这种方案
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5524 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 06:32 PVG 14:32 LAX 22:32 JFK 01:32
    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