求助:数据库表结构设计与平均转发的问题

bisal(Chen Liu)
博客专家认证
2010-09-02 08:51:31
问题1:
现在有这样一些记录:
ID NAME STATUS UPDATE_TIME
1 a b ...
2 c d ...
...
2 f g ...
1 k j ...
1 p q ...
...

即ID号可能一段时间后会重复,但对应不同的记录,这里不用担心一个ID对应多条记录的冲突,只是想存储这些数据,然后可以比如按照ID查出其对应的时间名称等等。

但现在如果存储一个月的数据就有几百万,想做切分表,分成多个表来存储,开始想的是:
表1:存储ID
表2:存储ID和其它所有字段,并且将ID作为外键关联到表1的ID。
这样在检索ID时就可以现在表1中检索,然后再到表2。

但有两个问题不太清楚:
1、若检索时间范围,则只能在表2检索,是否会有性能影响?
2、表1和表2的ID都不能作为主键,因为可能有重复的值,这种情况下,用表2的ID座位表1的外键是否合适呢?

这种数据库结构的设计以前接触的不多,还请高手指点!谢谢!


问题2:
有个表:
ID DATE
1 10:10
2 10:15
3 10:50
4 10:05
5 10:10
1 9:45
3 9:50
2 10:00
...

然后要做的是在proc中先按照时间顺序排列select出这些记录,然后有5个地址,要求:
1、相同ID的要发到同一个地址
2、尽量保证不同ID平均发到5个地址,例如发送到地址1的有5个ID,发送到地址2的有5个ID,发送到地址3的有5个ID,发送到地址4的有5个ID,发送到地址5的有4个ID。

之前我的想法:
1、如果不考虑相同ID必须发到同一个地址,我可以在一个ID发到地址1时加个变量,例如ind=2,这样处理下一个ID时就会进入地址2,在地址2中指定变量ind=3,下一个ID处理时就进入地址3,以此类推。
2、如果相同ID发到同一个地址,可以对ID%5取模,例如模是0的发到地址1,模是1的发到地址2,以此类推。

但现在的情况是以上两种的合体,所以思路还不是很清晰,大家讨论下,谢谢高手指点!
...全文
116 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bisal(Chen Liu) 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hyee 的回复:]

问题1:
外键的要求是它所指向的其他表的列必须是主键或唯一键,所以在表1的ID重复的情况下,用外键的方式是不可行的。
你可以只使用一张表,然后建一个基于ID的hash 32全局分区索引,或使用位图索引。示例:
create index ix_table_id on table1(id) partition by hash(id) partitions 32;
……
[/Quote]


但您这里我觉得仅仅是在数据中对不同的id进行了分类(分为了5类),但如果按这种方式,有可能select出的记录都是属于1类的。因此是否应该在select出的子集中可以对这些id进行分类呢?思路很混乱
minitoy 2010-09-02
  • 打赏
  • 举报
回复
伪列id不能唯一表征一条记录的情况很少见.
你这样设计会给后面处理埋下很大隐患.
hyee 2010-09-02
  • 打赏
  • 举报
回复
问题1:
外键的要求是它所指向的其他表的列必须是主键或唯一键,所以在表1的ID重复的情况下,用外键的方式是不可行的。
你可以只使用一张表,然后建一个基于ID的hash 32全局分区索引,或使用位图索引。示例:
create index ix_table_id on table1(id) partition by hash(id) partitions 32;
关于基于时间统计的问题,如果时间跨度都在同一月内,也可以建基于月的按时间分区的索引。
问题2:
我想问题集中在如何给ID分组。如果分组允许不完全平均,那么可以通过ora_hash(id,4)获得组ID。
如果分组要求尽量平均,并且id不连续,那么可通过mod(dense_rank() OVER(ORDER BY id),5)获得组ID。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧