问题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,以此类推。但现在的情况是以上两种的合体,所以思路还不是很清晰,大家讨论下,谢谢高手指点!

解决方案 »

  1.   

    问题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。
      

  2.   

    但您这里我觉得仅仅是在数据中对不同的id进行了分类(分为了5类),但如果按这种方式,有可能select出的记录都是属于1类的。因此是否应该在select出的子集中可以对这些id进行分类呢?思路很混乱