浏览 5228 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-28
方案1:
简单分析利弊: 对于一个对象查询:
通过上面的分析好像天平已经很明显倒向了方案2.但是方案2也有一些弊端
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-28
我没觉得方案1有什么清晰的,相对方案2,它的数据库结构更复杂。
所以,最后就是能不能忍受方案2的第一个弊端。 我也不认同方案2的第二个弊端。 在我们的系统中,大量应用方案2,也许是因为我们是搞C、C++出身的, 选择方案2是很自然的事。 |
|
返回顶楼 | |
发表时间:2006-12-29
最好的设计方式当然是1.对于统计分析非常方便。而且逻辑上也比较清晰易读。
引用 对象主表中多一个字段bool_status 用二进制的byte来表示对象的boolean属性 例如:isXX1 = 1, isXX2 = 2, isXX3=4, isXX4=8, isXX5=16 然后bool_status存放所有boolean属性之和。 例如对象A拥有issXX1=true, isXX2=true,那么这个对象在数据库中bool_status的值就是3 例如对象b拥有issXX1=true, isXX5=true,那么这个对象在数据库中bool_status的值就是17 如果把多个BOOL字段放在一个字段中,不能这样表示。1+2+3=6,2+4=6,1+5=6,这个可能性也太多了。如果非要放在一个字段里,可以用字符串来代替。比如10011,表示isXX1=true,isXX2=false,isXX3=false,isXX4=true,isXX5=true。这样在统计的时候也还比较方便。就是可读性差很多。 |
|
返回顶楼 | |
发表时间:2006-12-29
together 写道 最好的设计方式当然是1.对于统计分析非常方便。而且逻辑上也比较清晰易读。
引用 对象主表中多一个字段bool_status 用二进制的byte来表示对象的boolean属性 例如:isXX1 = 1, isXX2 = 2, isXX3=4, isXX4=8, isXX5=16 然后bool_status存放所有boolean属性之和。 例如对象A拥有issXX1=true, isXX2=true,那么这个对象在数据库中bool_status的值就是3 例如对象b拥有issXX1=true, isXX5=true,那么这个对象在数据库中bool_status的值就是17 如果把多个BOOL字段放在一个字段中,不能这样表示。1+2+3=6,2+4=6,1+5=6,这个可能性也太多了。如果非要放在一个字段里,可以用字符串来代替。比如10011,表示isXX1=true,isXX2=false,isXX3=false,isXX4=true,isXX5=true。这样在统计的时候也还比较方便。就是可读性差很多。 1 可以用 2 可以用 3 不能用 5 不能用 能用的数必须是2的n次方 |
|
返回顶楼 | |
发表时间:2006-12-29
Ivan Li 写道 1 可以用 2 可以用 3 不能用 5 不能用 能用的数必须是2的n次方 这个约束太强了吧。一不小心很容易出错的。我们现在就用的是10010011这种方式。需要根据不同字段值来统计的时候也还比较方便。 |
|
返回顶楼 | |
发表时间:2006-12-29
together 写道 Ivan Li 写道 1 可以用 2 可以用 3 不能用 5 不能用 能用的数必须是2的n次方 这个约束太强了吧。一不小心很容易出错的。我们现在就用的是10010011这种方式。需要根据不同字段值来统计的时候也还比较方便。 1 = 0001 表示一个boolean xx1值 2 = 0010 表示一个boolean xx2值 3 = 0011 无法表示一个boolean xx3值 如果字段存成3,它一定是xx1 = true, xx2=true 如果3也可以表示boolean xx3的话,就会出现歧异 |
|
返回顶楼 | |
发表时间:2006-12-29
together 写道 最好的设计方式当然是1.对于统计分析非常方便。而且逻辑上也比较清晰易读。
引用 对象主表中多一个字段bool_status 用二进制的byte来表示对象的boolean属性 例如:isXX1 = 1, isXX2 = 2, isXX3=4, isXX4=8, isXX5=16 然后bool_status存放所有boolean属性之和。 例如对象A拥有issXX1=true, isXX2=true,那么这个对象在数据库中bool_status的值就是3 例如对象b拥有issXX1=true, isXX5=true,那么这个对象在数据库中bool_status的值就是17 如果把多个BOOL字段放在一个字段中,不能这样表示。1+2+3=6,2+4=6,1+5=6,这个可能性也太多了。如果非要放在一个字段里,可以用字符串来代替。比如10011,表示isXX1=true,isXX2=false,isXX3=false,isXX4=true,isXX5=true。这样在统计的时候也还比较方便。就是可读性差很多。 这种用字符串的统计肯定没有方案2快 方案2是对字段做& 而你这种方案要解析字符串 |
|
返回顶楼 | |
发表时间:2007-07-22
直接使用8421的设计原则就好了,通过计算后的整数值来确定哪一个boolean值为真。
参考linux下的读写权限设计。 |
|
返回顶楼 | |
发表时间:2007-07-23
如果仅仅是把数据库看作存储,当然采取方案2。如果把数据库看作有意义的数据,那当然是方案1。
方案1其实没有那么多缺点的: 如对于A表,建立A_booleans表,结构为:id和attr,id为外键连接到A,attr为字符串,值如XX1,XX2。。。 这样: 对于一个对象查询: * 方案1:需要2条sql才能查出一个对象 如果有子查询,一个sql也行。 对于一个对象插入: * 方案1:一定是1+cont(boolan_attr=true)条insert sql 有些数据库可以一个sql插入若干记录的,所以也只要2个insert。况且insert可以batch嘛。问题不大的。 对于一个对象boolean属性的更新: * 方案1:1条delete+cont(boolan_attr)条insert sql 同上,问题不大。 对于一个对象的删除,都暂不考虑记录历史 * 方案1:1条delete主表+1条delete bool属性表 带cascade的,1句就好了。 |
|
返回顶楼 | |