以1NF为例:
现在我的表 A 中有主键 id 和字段 cstr,其中 cstr 是一个用分号;分隔的字符串,比如"c1;c2;c3;c4;c5"
在我的业务需求中,既有 id - "c1;c2;c3;c4;c5" 这样的关系查询, 也有 id - "c1" 或 id - "c2" 这样的关系查询。如果遵守 1NF ,则我应该做3个表,A(id),C(c),B(id,c),其中c是把字符串按分号拆分以后的子串值。
这样的坏处是:如果我要查询某个id对应的字符串,就要通过 B表根据id查询所有符合条件的 c,然后将它们组合起来
显然,如果字符串很长,子字符串数量很大的时候,这样组合操作会占用额外的时间开销。如果不遵守 1NF, 则我只做1个表,A(id,cstr),其中cstr是用分号分隔的字符串。
这样的坏处是:如果我要查询某个id对应的某个子串c,就需要拆分后再判断,时间开销更大。。——————————————————————我的做法是:同时遵守和不遵守1NF,即:A(id,cstr)
C (c)
B (id,c)这样无论通过 id 查找整个字符串 cstr 还是查找子串 c都很方便。
坏处就是空间开销会大,数据冗余多。不过如果在数据量不大的情况下,这样做是否也算是一种耗费空间开销节约时间开销的方案?