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

疑问贴:大佬们在什么情况下,会考虑数据库字段存 json

  •  
  •   Visitor233 · 39 天前 · 4068 次点击
    这是一个创建于 39 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT ,新项目( C#,postgresql )还在编写中,有部分配置信息是用 json 存在表字段里,因为每个单独的配置内容部分不一样。

    写着写着发现,经常要拿 json 里的部分一样的数据做查询条件,联表条件,分组条件。pg 有 json 函数好操作 json ,但又不想增加维护 sql 的工作,大家都写的 ef 或者 linq 。

    跟组长讨论后,决定是放出来做单独的字段。

    存 json 实用性受限呐。

    53 条回复    2021-10-29 10:13:08 +08:00
    xiang0818
        1
    xiang0818  
       39 天前
    不考虑
    binux
        2
    binux  
       39 天前 via Android   ❤️ 10
    当然是不需要「做查询条件,联表条件,分组条件」的时候啊
    pengtdyd
        3
    pengtdyd  
       39 天前   ❤️ 1
    设计这个极度依赖经验,看具体业务而定
    leeg810312
        4
    leeg810312  
       39 天前   ❤️ 2
    我有在字段里存 json 数据,但仅限单表查询,不会用 json 里的数据联表、分组、排序。查询中需要处理 json 时,用 EF Core DbFunction 写一个方法注册到 DbContext 里,一般用在 Linq Where 或 Select 方法里。
    bleaker
        5
    bleaker  
       39 天前   ❤️ 1
    非常确定(在自己跑路之前)不会和其他东西做关联查询,并且 json 字段内容非常不固定的时候

    非要查的话可以用 JsonPath ( linq 更好用但是非 dot net 没得)糊一下
    Visitor233
        6
    Visitor233  
    OP
       39 天前
    @leeg810312 我刚才也看到了 DbFunction ,确实有意思 ,可惜 Microsoft.EntityFrameworkCore v5.0.0 包里的方法没有适合操作 json 的,json_value 也只是 sql server 中用。
    itechnology
        7
    itechnology  
       39 天前   ❤️ 4
    在记录第三方接口调用结果的时候。
    cco
        8
    cco  
       39 天前   ❤️ 1
    存复杂结构的时候。
    Seayon
        9
    Seayon  
       39 天前   ❤️ 1
    输入输出参数的原始日志
    InDom
        10
    InDom  
       39 天前   ❤️ 1
    如果不确定的话,干脆上 MongoDB 吧,用的时候也省心了。
    tabris17
        11
    tabris17  
       39 天前   ❤️ 1
    在确定了产品经理有多不靠谱的情况下
    tabris17
        12
    tabris17  
       39 天前   ❤️ 2
    两个前提:
    1 、结构不确定
    2 、数据整存整取
    Visitor233
        13
    Visitor233  
    OP
       39 天前
    @bleaker JsonPath 看了会,好像可以用上,谢谢!
    wlfeng
        14
    wlfeng  
       39 天前   ❤️ 1
    举个例子,支付系统,不同平台的配置参数
    MonikaCeng
        15
    MonikaCeng  
       39 天前 via Android   ❤️ 1
    真要存 json 我就 mongo 了
    MonkeyJon
        16
    MonkeyJon  
       39 天前   ❤️ 1
    再不想多加字段或者满足不了业务的情况下
    Chad0000
        17
    Chad0000  
       39 天前   ❤️ 1
    再举个例子:快递面单打印模板,这完全是动态化的数据,也不会用来做查询。我就用 JSON 保存。同时支付系统参数我也是这么保存的。
    labulaka521
        18
    labulaka521  
       39 天前   ❤️ 1
    一些属性信息,不会被 sql 查询的
    chengyiqun
        19
    chengyiqun  
       39 天前   ❤️ 1
    记录第三方接口调用结果的时候
    RainCats
        20
    RainCats  
       39 天前   ❤️ 1
    一些因为业务显示加的乱七八糟的东西,并且不作查询条件字段的时候
    qwerthhusn
        21
    qwerthhusn  
       39 天前   ❤️ 1
    有些东西,你确定以后永远不可能作为条件查询的,尤其是那些更新很少或者会作为一个整体进行更新,字段也不需要解析作为计算条件的,其实都可以作为 json 存下来
    客户端需要的时候,直接丢出去即可。
    RangerWolf
        22
    RangerWolf  
       39 天前
    赞同二楼的说法,仅仅只是存储,几乎没有查询、搜索之类的需求
    clockwork1122
        23
    clockwork1122  
       39 天前   ❤️ 1
    刚好有同样的业务场景,数据库有个专门的表存配置信息,然后一个字段 key 作为区分不同配置,然后就六七个 value 字段表达配置信息。
    Biggoldfish
        24
    Biggoldfish  
       39 天前 via Android
    找个支持处理 semi structured data 的数据库,然後想存就存呗,最多用到的时候要带上 json path 而已
    BeautifulSoap
        25
    BeautifulSoap  
       39 天前
    LZ 这个问题,在我写公司的 CMS 的时候就遇到了,说白了 json 字段除了单纯的存储,存在的另一个非常重要的作用就是为了让 mysql 这样的 RDS 关系型数据库,能拥有像 mongodb 这样的 nosql 数据库能力

    在 json 字段出现之前,想让 mysql 拥有这种能力只能使用 EAV 模型:简单介绍可以看看这个文章 https://blog.huoding.com/2016/06/29/522
    infun
        26
    infun  
       39 天前
    存快照信息用,其它极少
    shylockhg
        27
    shylockhg  
       39 天前
    不需要表现 json 结构化语义时
    sunrain
        28
    sunrain  
       39 天前
    自定义埋点
    tranfer
        29
    tranfer  
       39 天前
    拿 RDB 凑活着存日志的时候, 存多了方便整体倒到 hive 去
    qwe520liao
        30
    qwe520liao  
       39 天前   ❤️ 1
    字段不需要被用于 SQL 查询过滤的时候,仅用于程序处理,就跟存二进制的数据一样,但不适用于 OLAP 系统。

    读写分离不仅仅只是在代码层面,而应该体现在整体的架构层面。例如游戏,存数据库只是为了存档,查询玩家数据只会用到 player_id 这一个字段,所有的操作都在内存完成,数据库存 JSON 或者二进制都没问题,甚至有时候都不需要数据库,开发测试的时候用文件来替代也是没问题的。

    但如果需要查询玩家的统计数据,应当抽离出来使用专门的查询分析系统,存储使用 ES 或者各种日志仓库系统。
    4771314
        31
    4771314  
       39 天前   ❤️ 1
    不需要做条件查询而且数据的字段比较多的情况,比如:活动配置
    fxxkgw
        32
    fxxkgw  
       39 天前
    只存储,不涉及查询

    还要考虑 json 和 dict/map 转化的问题,这个可以通过重定义、语法糖等方式解决。
    2i2Re2PLMaDnghL
        33
    2i2Re2PLMaDnghL  
       39 天前
    @tabris17 整存整取的话,json 相比 text 有优势吗
    meiyoumingzi6
        34
    meiyoumingzi6  
       39 天前
    用起来爽的一批, 维护起来就蛋疼了
    unclemcz
        35
    unclemcz  
       39 天前   ❤️ 1
    很多第三方数据采集的时候(比如爬虫)存 json 会更方便,可以不用太担心后期源数据结构不可控的变动。
    Visitor233
        36
    Visitor233  
    OP
       39 天前
    @clockwork1122 你这结构有点意思哦
    Visitor233
        37
    Visitor233  
    OP
       39 天前
    @qwe520liao 长见识了,谢谢!
    CoderLife
        38
    CoderLife  
       39 天前
    snapshot 这种得存 json
    loading
        39
    loading  
       39 天前
    有一次帮朋友用一两个小时二开的时候,不想改数据库,说要多加一个字段。
    我一看只有一个 asp 文件,我把人员性别那里改了。
    jorneyr
        40
    jorneyr  
       39 天前
    配置信息我喜欢存 JSON ,字段不单独查询的数据也考虑存 JSON
    wxw752
        41
    wxw752  
       39 天前
    说到这我就想喷我们部门经理,前期数据库存储非让我们怎么快怎么来,后期贼痛苦。
    很多年不敲代码只懂那些上个十年的技术,偏偏还喜欢对项目进行一番指导,说也不听...
    回想起来上一个微操大师还是蒋*石。
    dayeye2006199
        42
    dayeye2006199  
       38 天前   ❤️ 3
    pg 的 json 和二进制 jsonb 是可以建索引的。所以作为查询条件、连表条件都是没问题的。技术其实在进步,大家可以试着尝试一下这些数据库的新功能。

    我们现在的新项目都是上 PG ,关系型非关系型都是一套系统。全文索引也是用 pg 。后台的数据库选型异常的简单。
    (但我们不是做电商这样的高并发项目的,所以不清楚规模上去了会怎么样;在初创阶段,一个功能丰富的数据库能帮助到开发速度很多)
    qdcanyun
        43
    qdcanyun  
       38 天前
    赞同 @binux 的观点
    nziu
        44
    nziu  
       38 天前
    赞同 @dayeye2006199 的观点
    blackshow
        45
    blackshow  
       38 天前
    快找
    RRRoger
        46
    RRRoger  
       38 天前
    配置相关 结构相对简单 但是又可能随时添加 key 的时候把
    jtwor
        47
    jtwor  
       38 天前
    pg 对 json 解析查询不慢的,只是语法上多了一层,之前试过百万级查询也不慢。但需要做报表统计的数据还是不建议用 json ,其实存 json 是违反了三范式属性不可切割,而用 json 意味着数据是动态的,这样会使 sql 的逻辑要依赖 json 的结构(其实我觉得就是用 sql 做 nosql 的工作)。还有一个最重要的如果其他同事不会 pg 解析 json 的语法那。。这砖就只能是你一直搬了
    aristolochic
        48
    aristolochic  
       38 天前
    Ruby on Rails 生态里有一个东西叫做 PaperTrail ,是一个可以为任意资源提供更改审计的库,每当对配置好的某资源进行增删改的时候都会留下记录,供以后审计和回滚。思路很简单就是挂上钩子然后把原版序列化成 JSON (也可以选增量更新的插件),存到一个多态表里面。尤其是这个多态表,什么资源都有可能,就只能用 JSON 了。如果你用的是 PostgreSQL 的话它会鼓励你使用 JSON 的字段,但是其实只是用到了 PostgreSQL 对 JSON 的校验而已。

    所以,简单来说,就是快照。
    WhatIf
        49
    WhatIf  
       38 天前
    1 懒
    2 数据情况动态且未知,且永远在变化
    3 出现了 2 ,后来稳定了,但是懒,不想改
    locoz
        50
    locoz  
       38 天前 via Android
    面对字段很多的第三方接口返回的结果时,对非关键信息不考虑查询问题,而是为了以往万一以后需要的时候。
    Fizzyi
        51
    Fizzyi  
       38 天前
    我们一般把不设计查询的字段放在 json 里面
    nekoneko
        52
    nekoneko  
       38 天前
    把那一部分会用作搜索条件的搞成字段不行吗.
    rodrick
        53
    rodrick  
       37 天前
    画面上就是要显示 json 的时候
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1308 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 17:31 · PVG 01:31 · LAX 09:31 · JFK 12:31
    ♥ Do have faith in what you're doing.