2006-12-28
用于保存对象boolean属性的两种数据设计方案
关键字: database sybase
需求很简单:
方案1:
简单分析利弊:
对于一个对象查询:
通过上面的分析好像天平已经很明显倒向了方案2.但是方案2也有一些弊端
- 1:一个对象,它对应数据库中的一条记录。
- 2:这个对象可能有很多boolean属性,例如isXX1, isXX2, isXX3,isXX4(但是有限,未来还可能增加)。
- 3:这个对象的这些属性在应用中可能被频繁的更新。
方案1:
- 对象主表,用于保存对象常规属性,例如,id,name等等。
- 对象boolean属性表,跟对象主表外键关联。
- 对象主表中多一个字段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
简单分析利弊:
对于一个对象查询:
- 方案1:需要2条sql才能查出一个对象
- 方案2:一条sql就可以查出一个对象
- 方案1:一定是1+cont(boolan_attr=true)条insert sql
- 方案2:一条update sql
- 方案1:1条delete+cont(boolan_attr)条insert sql
- 方案2:一条sql就可以更新
- 方案1:1条delete主表+1条delete bool属性表
- 方案2:1条delete主表
- 明显方案2占的数据库空间比方案1少。
通过上面的分析好像天平已经很明显倒向了方案2.但是方案2也有一些弊端
- 1:对于统计不是很友好,例如针对统计对象的没个属性进行统计,某些属性的组合进行统计,那么对于方案2就不得不对表中所有的bool_status进行&计算,这个不利于数据库运用索引。
- 2:如果一个对象的boolean属性有很多是true那么bool_status这个值望望会令人不知所云,一定要应用程序decode才能看出来这个对象到底那些boolean属性是true。
- 11:50
- 浏览 (2541)
- 论坛浏览 (2783)
- 评论 (8)
- 分类: 技术天地
- 相关推荐
评论
如果仅仅是把数据库看作存储,当然采取方案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句就好了。
方案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句就好了。
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。这样在统计的时候也还比较方便。就是可读性差很多。
引用
对象主表中多一个字段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是对字段做&
而你这种方案要解析字符串
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的话,就会出现歧异
Ivan Li 写道
1 可以用
2 可以用
3 不能用
5 不能用
能用的数必须是2的n次方
这个约束太强了吧。一不小心很容易出错的。我们现在就用的是10010011这种方式。需要根据不同字段值来统计的时候也还比较方便。
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。这样在统计的时候也还比较方便。就是可读性差很多。
引用
对象主表中多一个字段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次方
最好的设计方式当然是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。这样在统计的时候也还比较方便。就是可读性差很多。
引用
对象主表中多一个字段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。这样在统计的时候也还比较方便。就是可读性差很多。
发表评论
该博客是同时发布到论坛的,无法评论在论坛已被锁定的帖子
最新评论
-
使用ubuntu作为工作桌面详 ...
Oracle的Oracle SQLDeveloper可以用也可以把windowz ...
-- by zhoun -
使用ubuntu作为工作桌面详 ...
Ivan Li 写道moonjava 写道一些数据库的客户端呢? Oracle可 ...
-- by moonjava -
使用ubuntu作为工作桌面详 ...
moonjava 写道一些数据库的客户端呢? Oracle可以用Oracle S ...
-- by Ivan Li -
使用ubuntu作为工作桌面详 ...
写得不错!只是觉得linux下顺手的软件太少
-- by vdgame -
使用ubuntu作为工作桌面详 ...
一些数据库的客户端呢?
-- by moonjava







评论排行榜