比如有三个字段,ABC。A为1时,BC为必填项,A为2时,BC为非必填项。
这个需求,数据库方面,还有Controller层校验,我应该怎么写比较好呢?
或者说更广一些,就是字段之间有相互影响的关系,对于入参校验和数据库表设计,应该怎么办?
一般数据不作校验,在程序中校验:在录入的时候前端JS校验一遍,然后后端代码中再校验一遍。
首先,不是任何一层都需要做数据校验。在关键的点做数据校验是一个因素,在入口处尽早做数据校验也是一个因素。
就你的需求简单来看,是数据关联性问题,越前置这个校验,开销越小。如果在前端页面就做了检查,后面的Controller层直接不校验也是可以的,Model层数据库入库时,不校验也是可以的。如果为了前后端分离,前端做一次校验,controller再做一次校验的设计,也算是正常可以接受的。
所以,这个根本不是一个数据库表设计的问题,如果在数据库上做关联校验,反而是非常糟糕的做法,其一是它是最后一层,如果出错,要向上抛错误信息,穿透整个多层系统到前端,这太可怕了。现行设计中,很多人已经放弃了数据库外键等校验方法,因为灵活性和未来的维护性会有问题。
楼上说的基本正确。
1、数据库不做处理。
2、前端页面数据验证。
3、Controller 必须再次验证数据有效性,因为前端是可以被篡改的。
数据库设计:A 非空,BC 允许空或非空+默认值,一般数据库不做逻辑处理; 前端:用JS根据A的值校验BC; Controller:根据A的值校验BC(这里需要再校验一次)
上面说的很对哦,你用外键维护起来十分的麻烦,还是在前端和controller进行校验