一个多选的表单项,保存在数据库里面
1.如果选择范围固定,做字段合适
2.如果选择范围不固定,单列记录表合适。灵活,增加一个中间表,扩展性优于其余两种。
3.还有一种,将多选结果转变成字符串,用分号或者逗号隔开。效率低。查询麻烦。
位运算:这里用于多选状态,存储数据。
Int 32位,long 64位。超过64为建议用上面第三种方法。
一个字段可以解决,后期分析比较代码多一点。
扩展性不高,增加一个状态,要增加相关代码。
参考:
数据库设计——“多选状态标识”的处理
位运算(深入分析举例)
java中通过位运算实现多个状态的判断(我想找的)
java位运算与它的一个巧妙应用(带一个例子)
C#位运算的处理方法(权限管理中的权限运算)(我想找的)
public class WeiYunX {
class eType {
public final static int None = 0;
public final static int NeiXiao = (1 << 0);
public final static int RiBen = (1 << 1);
public final static int QiTaWaiXiao = (1 << 2);
}
public static void main(String[] args) {
wl("1<<0 = " + (1 << 0));
wl("1<<1 = " + (1 << 1));
wl("1<<2 = " + (1 << 2));
wl("1<<3 = " + (1 << 3));
wl("1<<4 = " + (1 << 4));
wl("1<<5 = " + (1 << 5));
wl("1<<6 = " + (1 << 6));
wl("1<<7 = " + (1 << 7));
wl("1<<8 = " + (1 << 8));
wl("1<<9 = " + (1 << 9));
wl("1<<10 = " + (1 << 10));
wl("1<<11 = " + (1 << 11));
wl("1<<12 = " + (1 << 12));
wl("1<<13 = " + (1 << 13));
wl("1<<14 = " + (1 << 14));
wl("1<<15 = " + (1 << 15));
wl("1<<16 = " + (1 << 16));
wl("1<<17 = " + (1 << 17));
wl("1<<18 = " + (1 << 18));
wl("1<<19 = " + (1 << 19));
wl("1<<20 = " + (1 << 20));
wl("1<<21 = " + (1 << 21));
wl("1<<22 = " + (1 << 22));
wl("1<<23 = " + (1 << 23));
wl("1<<24 = " + (1 << 24));
wl("1<<25 = " + (1 << 25));
wl("1<<26 = " + (1 << 26));
wl("1<<27 = " + (1 << 27));
wl("1<<28 = " + (1 << 28));
wl("1<<29 = " + (1 << 29));
wl("1<<30 = " + (1 << 30));
wl("1<<31 = " + (1 << 31));
wl("1<<32 = " + (1 << 32));
}
private static void wl(String msg) {
System.out.println(msg);
}
}
执行结果:
//一般等于无状态,不选,为:0
1<<0 = 1
1<<1 = 2
1<<2 = 4
1<<3 = 8
1<<4 = 16
1<<5 = 32
1<<6 = 64
1<<7 = 128
1<<8 = 256
1<<9 = 512
1<<10 = 1024
1<<11 = 2048
1<<12 = 4096
1<<13 = 8192
1<<14 = 16384
1<<15 = 32768
1<<16 = 65536
1<<17 = 131072
1<<18 = 262144
1<<19 = 524288
1<<20 = 1048576
1<<21 = 2097152
1<<22 = 4194304
1<<23 = 8388608
1<<24 = 16777216
1<<25 = 33554432
1<<26 = 67108864
1<<27 = 134217728
1<<28 = 268435456
1<<29 = 536870912
1<<30 = 1073741824
1<<31 = -2147483648
1<<32 = 1