=== 总原则 ===
1. 为确保数据完整性和逻辑性,重要字段,配置字段,影响多个关系或者程序运行的字段(如:trans_id_sql_str(抓取程序要用它来查询数据库),应尽可能not null
2. 在not null的情况下,不应不加考虑地给default值,否则将造成数据误导, 应只对重要性不高,或者逻辑上可以给default值的给default值,如性别-未知,初始金额-0,初始计数-0,时间-now()等
3. 在table注释或api文档中,应明确提示字段情况:
- not null (must supply anytime)
- not null (grauntee by default or trigger)
- allow null (be careful!)
4. 在sql程序或应用程序中,应严格按上面的api文档,该判断null的判断null,不该判断的不要乱判断,以免引起误导。并且可使程序的逻辑更为清晰。
5. 在是否null和是否给默认值的情况下,不应因考虑批量导入不完整的初始数据或测试数据的方便性而做出妥协。
=== allow null 的典型情况 ===
1. 外键缺失
将缺失外键默认设为0(对应一条id为0的假数据)是个坏主意,会带来比null更大的麻烦——关系误导从而产生连环错误。故这种情况还是应显式指明可以为null,明确表示关联关系不存在。
2. 确实可能一下子提供不了,并且也不会有重大或连锁影响的。
如:用户 UA,给默认值''是毫无意义的。