dushixiang
6.64D
V2EX  ›  数据库

明天就要软考了,我发现了数据库三范式之第一范式好像过时了

  •  
  •   dushixiang · 7h 6m ago · 3140 views

    第一范式( 1NF )要求数据库表中的每个列都是不可再分的原子值,即每个列都不能包含多个值或值的列表。

    现在使用 pg 的时候经常用 json 格式了,是不是违反了第一范式?

    46 replies    2026-05-22 19:12:33 +08:00
    fingerxie
        1
    fingerxie  
       7h 1m ago
    我也要软考了,我还一天没学 😭
    aes114514gcm
        2
    aes114514gcm  
       6h 57m ago
    注意适用范围
    pg 的定位是(Object-Relational Database Management System, ORDBMS)
    不是纯粹的关系型数据库
    dushixiang
        3
    dushixiang  
    OP
       6h 57m ago
    @fingerxie 明天别去受罪了,在家睡觉吧
    dushixiang
        4
    dushixiang  
    OP
       6h 56m ago
    @aes114514gcm mysql/sqlite 也有 json 格式的
    happyhou
        5
    happyhou  
       6h 56m ago
    是的,违反了 1NF 。
    Bigstupidcat
        6
    Bigstupidcat  
       6h 53m ago   ❤️ 1
    没事,考了也没啥用,除了进了个人才库,屁用没有,有这精力,准备准备考公吧
    Aethyr
        7
    Aethyr  
       6h 31m ago
    json 格式看场景
    互联网中第三范式才是人均不遵守
    momocraft
        8
    momocraft  
       6h 27m ago
    这是没人会 100%遵守的理论规则 比如用这个范式怎么存储地址
    Rickkkkkkk
        9
    Rickkkkkkk  
       6h 22m ago
    这种东西比接口的 RESTful 规范还没用一点

    感觉会把这种东西不断传播作为正确的人都是从来没有长期开发过任何一个复杂的商业系统。

    统一认定为没真正上过班
    adoal
        10
    adoal  
       6h 22m ago
    你都用 JSON 了,还想什么范不范式的
    foxhunt
        11
    foxhunt  
       6h 19m ago
    你最好想想为什么违背范式,能带来哪些好处
    明天要考
    beautyplus
        12
    beautyplus  
       6h 18m ago
    json 就是原子值,如果你存的 json 都是同字段的,那确实违反了,应该拆成原子
    cowcomic
        13
    cowcomic  
       6h 17m ago   ❤️ 2
    是的,现在很多系统数据库的设计都是反范式的
    三范式并不是一定要遵守,只是遵守但是能够帮你避免一些问题,但是可能会降低查询效率之类的
    可以根据自己的需求来打破范式,但每打破一个范式,就要增加对应的处理方案,避免引入新的问题,比如数据结构教研,数据同步更新等等
    huangsijun17
        14
    huangsijun17  
       6h 16m ago
    @aes114514gcm #2 但是,MySQL 存 JSON 的场景也不少了。是个 SQL ,甚至 NoSQL ,只要能存长字符串的,都会有人存 JSON 。
    zhuangzhuang1988
        15
    zhuangzhuang1988  
       6h 11m ago
    pg 还有 array
    airqj
        16
    airqj  
       6h 7m ago
    居然有人说数据库范式没啥用
    PS: 1981 的图灵奖就是颁发给研究数据库的,而数据库范式是其中很重要的一部分
    TataJiang
        17
    TataJiang  
       6h 7m ago
    三范式并不是不能违反的
    catning
        18
    catning  
       6h 2m ago
    范式没有万能的,具体还要根据你自己业务和上下游去决定。
    但是你不能不学,不能不了解这些范式是为了解决什么问题产生的。试想一下,一张表里只有 id 和 data 俩字段,做业务时候一把 data select 出来,然后在程序中用代码逻辑组织数据结构或者进行过滤,光想想就灾难。
    soleils
        19
    soleils  
       5h 49m ago   ❤️ 1
    @airqj 但那是 1981 啊, 祖宗之法不可违?
    shiny
        20
    shiny  
    PRO
       5h 46m ago
    先懂得规则,然后才能知道何时打破规则,代价是什么,收益是什么
    xxyzf
        21
    xxyzf  
       5h 36m ago
    是不是应该有个约束条件:在多大程度上是原子的,这就取决于业务需求了。
    shyrock2026
        22
    shyrock2026  
       5h 36m ago
    范式是思维模型,依据模型你就能知道你的设计如何取舍:应用便利、性能、扩展性等等。
    没人说按照范式执行一定更好,都是权衡和取舍。
    chendy
        23
    chendy  
       5h 22m ago
    三范式属于用了不会错,但是不一定好
    反范式一定是是有什么好处,但是可能会犯错,特别是为了偷懒反范式
    只能说具体情况具体分析
    dandel1on
        24
    dandel1on  
       5h 14m ago
    纸上谈兵不代表兵法书籍是无用的
    killva4624
        25
    killva4624  
       5h 12m ago
    那么,古尔丹,代价是什么呢
    piecezzz
        26
    piecezzz  
       5h 10m ago
    实践和理论不冲突啊
    adoal
        27
    adoal  
       5h 8m ago
    @huangsijun17 当长字符串存跟用原生 JSON 支持是两码事。后者可以直接对 JSON 内容做检索和解析。
    fredweili
        28
    fredweili  
       4h 38m ago
    你在说啥,考试该怎么复习准备?
    dacapoday
        29
    dacapoday  
       4h 27m ago
    现代数据库 json 列提供了按 json path 更新值,甚至按 json path 索引,把 json 列当 join 表,其中的每个 json path 当作真正的列值就行了。
    如果用字符串类型的列,强行存 json 序列化值,而不提供局部更新能力,才是违反范式。
    526326991
        30
    526326991  
       4h 26m ago
    原则 > 范式 = 风格
    leoJiu
        31
    leoJiu  
       4h 22m ago
    钱都交了,明天去裸考了,我是一道题都没刷
    dushixiang
        32
    dushixiang  
    OP
       4h 11m ago
    @dacapoday 有道理,但是 json 作为字段通常都是全部覆盖更新这个字段的吧(数据库层面),需要存储 json 字段的通常是一些配置项
    airqj
        33
    airqj  
       4h 10m ago   ❤️ 1
    @soleils 兄弟你是真 NB 。
    我只是反驳人家说的数据库范式无用论,没有说数据库一定得遵循规范来设计吧?
    dacapoday
        34
    dacapoday  
       3h 49m ago
    @dushixiang 这是一种场景,而且该场景下,该列不参与索引和进入过滤条件,也就是非关系的 blob 附件,那自然也不受范式约束了。
    635925926
        35
    635925926  
       3h 47m ago
    @Bigstupidcat 补贴了解下
    hongye
        36
    hongye  
       3h 45m ago
    @Rickkkkkkk

    这种看法片面了,也低估了范式与 REST 规范在复杂商业系统里的底层价值。
    数据库三范式从来不是死板教条,而是帮开发者规避数据冗余、更新异常、删除错乱的基础设计准则,真正长期做商业系统的人都清楚,前期不守范式,后期多表联查、数据同步、业务迭代、对账统计都会频繁出隐性 BUG ,维护成本会成倍飙升。
    RESTful 也同理,规范统一的接口设计,能降低跨团队协作、前后端对接、服务拆分重构的沟通损耗。
    规范本身不是束缚,而是工业级开发的通用共识,只会觉得规范无用,大概率只做过小体量单体项目,没经历过业务膨胀、数据迭代、多人协作、系统拆分的真实场景,自然体会不到底层规范规避风险、降本增效的实际作用。
    luoshuimumu
        37
    luoshuimumu  
       3h 43m ago
    后天考,明儿还能突击一天
    Rickkkkkkk
        38
    Rickkkkkkk  
       3h 41m ago
    @hongye 但实际上,真正设计的时候并不会拿着这些东西来用。

    恰恰是大规模的系统才不会去遵守这些协议,小的项目反而好实现

    (你可以随便去看阿里腾讯这种大厂的任何一个组,设计的时候这些规范都不会出现的
    FlashEcho
        39
    FlashEcho  
       3h 34m ago
    因为业务需求或者性能考虑不遵守某些范式很正常,可以看下 DDIA 相关章节: https://ddia.vonng.com/ch3/#sec_datamodels_normalization
    BeiChuanAlex
        40
    BeiChuanAlex  
       3h 26m ago
    你说他没用,还是有用,你说他有用,它却没啥用,实际就是鸡肋
    shellj
        41
    shellj  
       3h 19m ago
    突然想起来我也报名了,一点没学
    hongye
        42
    hongye  
       3h 10m ago
    @Rickkkkkkk #38 恰巧我在交易中心工作过一段时间,应该是比较核心的系统了。方案评审的审核还是很关注库表设计的,DBA 会耳提面命的。
    wysnxzm
        43
    wysnxzm  
       3h 3m ago
    RESTFul JWT 中台 DDD 数据库三范式 有勇士凑齐了吗
    Rickkkkkkk
        44
    Rickkkkkkk  
       3h 0m ago
    @hongye 当然会注重 db 字段的设计,接口的设计也会考虑。

    我的意思是,但这里并不会去通过范式、restful 这种规范来考虑。你会有印象在讨论设计合理性上,有人提过 db 范式吗?说实话我工作这么多年,几个大厂也呆过,从来没听过。
    ntedshen
        45
    ntedshen  
       1h 49m ago
    说到底远古时期算力和 io 都严重不足,只有遵守范式你这个系统才不会三天两头卡出屎,没有其他路可以走。。。
    现在这年头处理器核心数跟个不要钱一样,存储的 io 和容量起码都翻了几万倍。。。
    时代变了,现在遵守这东西和进机房要穿鞋套有啥两样。。。
    真要考究到这些,那你也不会问这个了
    Plutooo
        46
    Plutooo  
       1h 37m ago
    不是过时了,是还有个相应的概念叫“反范式”,但更多实践上来说大概率是二者都沾一点,从“没有银弹”的角度来说,软件工程还是符合国人的“折中”的习性的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2740 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 129ms · UTC 12:50 · PVG 20:50 · LAX 05:50 · JFK 08:50
    ♥ Do have faith in what you're doing.