sql 表设计问题:需索引的可选字段应该允许 null 吗?

2022-12-29 10:16:35 +08:00
 1800x

比如一个用户表,中间一个字段,表示用户所属的企业。

用户可能不属于任何企业。

那么有两种解决方案:

  1. 企业字段允许为 null 。用户不属于企业时,企业字段为 null 。
  2. 企业字段不允许为 null ,默认 0 。用户不属于企业时,企业字段为 0 。

再叠加一个需求,用户表的企业字段需要加索引。

那么,应该选择哪个方案?或者有没有更好的方案?

3798 次点击
所在节点    数据库
42 条回复
root000
2022-12-29 10:20:40 +08:00
2
Xhack
2022-12-29 10:22:37 +08:00
is null And is not null 是不会走索引的
isora
2022-12-29 10:24:20 +08:00
iseki
2022-12-29 10:25:54 +08:00
依业务需求而定,数据库不能好好处理就说明该换数据库了
Xhack
2022-12-29 10:26:56 +08:00
@Xhack 我说错了
imv2er
2022-12-29 10:33:19 +08:00
业务逻辑设计上选 1
有查询需求的 选 2
securityCoding
2022-12-29 10:34:16 +08:00
2
lambdaq
2022-12-29 10:50:27 +08:00
mysql 还是别用 null 了。
CodeCodeStudy
2022-12-29 10:59:06 +08:00
mysql 字段不使用 null 的理由

1 、比如文章点击量加 1 ,column_name = column_name + 1 ,如果把字段设成 null ,并且插入数据时没指明 column_name = 0 ,那么+1 操作不起作用;
2 、count(column_name)时,null 的列不包含在内,count(*)则包含 null 的列在里面
3 、计算多列时,如 SELECT id, click1+click2 as click FROM `foo` 如果两个点击量有一个为 null ,那么相加结果就是 null
4 、如果有比较条件,比如 where < 10 ,如果为 null 的话则不包含在内
5 、min(column_name), max(column_name)如果字段有值,则用值比较,如果字段没有值,都是 null 的时候,则为 null

总结:不能运算,不能比较,慢
jarvanluo
2022-12-29 11:06:10 +08:00
mysql 我一般都是有默认值,不允许 null 的。text 除外。
bthulu
2022-12-29 11:11:24 +08:00
我反正是这么来的, 所有表字段都必须设置不允许为 null.
这样在 java 里会减少很多 NPE.
aichunya
2022-12-29 11:29:31 +08:00
现在项目里面,除了类似'收货时间'这种具有业务意义的 date 类型的字段允许为 null 以外,其它类型字段都会设置默认值
makelove
2022-12-29 11:41:47 +08:00
别听楼上的瞎 bb ,这种情况明显用 null
oneisall8955
2022-12-29 11:43:32 +08:00
某些 datetime 含业务含义和 text 类型的允许 null ,其余都 not null 了
clockwork1122
2022-12-29 12:18:21 +08:00
@oneisall8955 datetime 是真让我最讨厌的玩意,一般查询的场景都只需要 date 就行,数据库用 datetime 给自己增加查询难度。
cpstar
2022-12-29 12:37:34 +08:00
@CodeCodeStudy 9# 你这些数值比较的字段,不应该把字段设置为数值类型的同时默认值是 0 ?

oracle 的 varchar2 类型,空值即为 null 。
meshell
2022-12-29 13:09:21 +08:00
我说个其它的,在使用 ORM 的 one many 的时候 null 和 0 区别对待的。0 是找不到企业报错,null 没有企业
yfwl
2022-12-29 13:16:08 +08:00
如果你要给这个列创建索引,那就不能 null ,因为 null 不走索引的,正常的列是允许 null 的
seth19960929
2022-12-29 13:23:28 +08:00
楼上的是不是都要更新知识了? MySQL null 列可以走索引.
我的建议还是你用 null, 毕竟 null 和 0 还是不一样的.
至于加不加索引和 null 不 null 无关, 取决于你的用户是否大多数有企业.
比如你一百万用户就一百个有企业, 别加了. 如果大多数都有, 那就加
seth19960929
2022-12-29 13:24:55 +08:00
再补充一个, 取决于你的业务需求, 如果你业务代码都是.
1. 先去查找用户 -> 然后在通过用户的企业主键去查找企业 = 不用加索引
2. 找用户 -> join 企业 = 加索引
3. 找这个企业下的用户 = 加索引

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/905289

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX