你们数据库 ORM 框架可选字段会设计成 Nullable 吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
edis0n0

你们数据库 ORM 框架可选字段会设计成 Nullable 吗?

  •  
  •   edis0n0 Sep 8, 2022 3970 views
    This topic created in 1328 days ago, the information mentioned may be changed or developed.
    例如我们的商品描述字段,不填则显示后台设置的缺省数据。感觉是用 Nullable 更合适,不填描述直接存 null ,但是这样的话每次取值都要用 String.IsNullOrEmpty 判断一下,然后手动 cast 成 string 才能被一些函数使用。偶尔忘记判断 null 了,在复杂的逻辑中 IDE 也没报错,就会导致 500 错误。看了下 Jellyfin 等 C#的开源项目貌似用的都是 String.Empty 当缺省值。
    21 replies    2022-09-09 13:01:43 +08:00
    thinkershare
        1
    thinkershare  
       Sep 8, 2022
    会使用, 因为有些类型必须是 Null, 数值,字节这种, null 和任何其它值都没有重叠部分, 因此实际上没得选, 你必须选择一个值来表达是真正的没有. 文本类型需要看实际, 如果需要区分 null 和'', ' ', '\r\\n'这些, 还是会使用 Nullable.
    mineralsalt
        2
    mineralsalt  
       Sep 8, 2022
    我平时大量使用 null, 因为很多数据就应该是没有的, 而不是空字符或者 0
    lujiaosama
        3
    lujiaosama  
       Sep 8, 2022
    你要是用 0, '' 来代替空值那问题更多.
    hingbong
        4
    hingbong  
       Sep 8, 2022 via Android
    看业务,业务有空值就用
    potatowish
        5
    potatowish  
       Sep 8, 2022 via iPhone
    就用 null ,用空字符就是给自己找麻烦
    dcsuibian
        6
    dcsuibian  
       Sep 8, 2022
    虽然判断麻烦点,但我倾向于保留正确的语义
    Jaufey
        7
    Jaufey      Sep 8, 2022 via Android
    建议用 null ,否则很容易引发混乱。
    最近碰到一个 config 字段:
    1. 初始是 "",用来表示此字段未设置
    2. 不允许写 null ,前端传空只能传 {}。但 {} 又是 falsy 的,导致前端判空需要多余动作...

    就特别奇怪
    TWorldIsNButThis
        8
    TWorldIsNButThis  
       Sep 8, 2022
    空值处理本来不应该成为心智负担,这也是为什么我们需要现代编程语言
    jinliming2
        9
    jinliming2  
       Sep 8, 2022 via iPhone   1
    @WhateverYouLike 你说的前端是 JS 吗? JS 里 {} 是 truthy 的啊,是打错了吗?
    Jaufey
        10
    Jaufey  
       Sep 8, 2022
    @jinliming2 是的,打错了
    tf2
        11
    tf2  
       Sep 8, 2022
    字符串,数字其实可以通过猥琐的技巧避免 null

    datetime 不得不用。。。。太蛋痛了。
    BeautifulSoap
        12
    BeautifulSoap  
       Sep 9, 2022
    空值和 null 值不是一个概念,空值和 null 的业务逻辑经常是会不同的。至于用-1 或者什么特殊数字代替 null 的,同样会有我这值就是-1 的话该怎么办的问题。所以 null 经常是必须的
    littlewing
        13
    littlewing  
       Sep 9, 2022
    大胆地用,不要相信网上那些千篇一律的抄的文章说有 NULL 不能用索引,查询效率低等,纯属胡扯
    nothingistrue
        14
    nothingistrue  
       Sep 9, 2022
    字符串可以用空字符串代替 NULL ,只要全局约定好即可。但是还是不如不区分 null 或 empty ,统一使用 StrUtil.isEmpty/isNotEmpty 来判断更好。因为有些数据库,比如 Oracle ,它本身是不区分 char/varchar 类型列的 null 和 空白的(这些列 column is null 跟 column = '' 总是返回相同结果)。null 字符串的显示,确实不好处理,但这是纯 UI 层次的问题,ORM 层不应该考虑。

    非字符串类型,那就不用说了,如果没有默认值,那就必须提供 NULL。

    如果业务上应该有默认值,最好还是以默认值代替 NULL 。但是记住,这是业务逻辑的要求,不是性能的要求。现行数据库( Mysql 除外),基本都不会因为 NULL 值影响性能。
    hezhiming1993
        15
    hezhiming1993  
       Sep 9, 2022 via Android
    搞了很多中大型模块,基本不用 null
    hay0577
        16
    hay0577  
       Sep 9, 2022
    springboot 字段是 null 的话 返回给前端的 数据里连这个字段的 key 都会隐藏了.
    lmshl
        17
    lmshl  
       Sep 9, 2022
    我用的语言里要么支持 Maybe T ,Option[T],Option<T> ( Haskell/Scala/Rust
    要么支持 T?( Kotlin ,TypeScript
    所以 ORM 想用 null 就用 null ,完全不操心 NPE
    loolac
        18
    loolac  
       Sep 9, 2022
    建议约定零值。null 在排序上就是个麻烦,因为编程语言里面和 null 和 其它类型混合排序和数据库中的 null 混合排序大概需要一点点去实践和判断,不同数据库有不一样的做法,这才是最麻烦的,一些常用的比较运算也不适用 null 值,这会使查询条件复杂化,不利于查询优化。
    YUyu101
        19
    YUyu101  
       Sep 9, 2022   1
    本来就应该是 null 的,以为省事其实最后都会还回去
    Leviathann
        20
    Leviathann  
       Sep 9, 2022
    约定空值,那代码里还得时刻记得判断一下是不是约定值?还是说每个类都手写一个反序列化转换?
    kzzhr
        21
    kzzhr  
       Sep 9, 2022 via Android
    10 亿美金的错误
    About     Help     Advertise     Blog     API     FAQ     Solana     3782 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 109ms UTC 10:30 PVG 18:30 LAX 03:30 JFK 06:30
    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