IM 开源项目 群组服务 数据库设计 (01)

来源:互联网 发布:重庆大学网络自助 编辑:程序博客网 时间:2024/06/05 05:42
 


废话不说,直接上表

列名

说明

类型

长度

是否主键

可否为空

描述

p_group_id

群组ID

Bigint

20

Yes

No

 

p_group_creater_id

创建者ID

Bigint

20

 

No

 

p_group_create_datetime

创建时间

Bigint

20

 

No

 

p_group_statu

状态

Tinyint

20

 

No

 

1 表名 t_group_base_property “群组基本信息”

 

 

 

 

 

 

其中 p_change_type     1 表增加;2 表修改 3 表删除

          p_group_statu      1 可用;  2 不可用(例如被禁用的群) 后续会增加类型

 

 

列名

说明

类型

长度

是否主键

可否为空

描述

p_change_id

递增ID

bigint

20

Yes

No

 

p_group_id

群组ID

bigint

20

 

No

 

p_change_type

变化类型

tinyint

4

 

No

1 ,2, 3

p_group_creater_id

创建者ID

Bigint

20

 

No

 

p_group_create_datetime

创建时间

Bigint

20

 

No

 

p_group_change_datetime

变化时间

Bigint

20

 

No

 

p_group_statu

状态

Tinyint

20

 

No

 

2. 表名 t_group_base_property_change “群组基本信息变化表

 

 

 

 

 

 

 

 

 

 

列名

说明

类型

长度

是否主键

可否为空

描述

p_group_id

群组ID

bigint

20

Yes

No

 

p_group_owner_uid

群主ID

bigint

20

 

No

 

p_group_level

等级

Int

11

 

No

 

p_group_parents_type

父类型

int

11

 

No

 

p_group_child_type

子类型

int

11

 

No

 

p_group_name

名称

varchar

20

 

No

 

p_group_announcement

公告

varchar

50

 

Yes

 

p_group_description

描述

varchar

50

 

Yes

 

p_group_join_type

加入类型

tinyint

4

 

No

 

3. 表名 t_group_dynamic_property “群组动态信息表”

 

 

 

 

 

 

 

 

 

 

 

 

其中 p_group_parents_type EG:技术联盟 p_group_child_type EG: 软件交流 需配类型表

 

 

列名

说明

类型

长度

是否主键

可否为空

描述

p_change_id

递增ID

bigint

20

Yes

No

 

p_group_change_type

变化类型

smallint

6

 

No

 

p_group_change_datetime

变化时间

bigint

Bigint

 

No

 

p_group_id

群组ID

bigint

20

 

No

 

p_group_owner_uid

群主ID

bigint

20

 

No

 

p_group_level

等级

Int

11

 

No

 

p_group_parents_type

父类型

int

11

 

No

 

p_group_child_type

子类型

int

11

 

No

 

p_group_name

名称

varchar

20

 

No

 

p_group_announcement

公告

varchar

50

 

Yes

 

p_group_description

描述

varchar

50

 

Yes

 

p_group_join_type

加入类型

tinyint

4

 

No

 

4.  表名 t_group_dynamic_property “群组动态信息变化表”

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以上表是固定表,存储过程太简单就不列在这里了

 

 

 

列名

说明

类型

长度

是否主键

可否为空

描述

p_group_id

群组ID

bigint

20

Yes

No

 

p_group_member_id

成员ID

bigint

20

Yes

No

 

p_group_member_identity

成员身份

smallint

6

 

No

 

p_group_member_join_datetime

加入时间

bigint

20

 

No

 

5.表名 t_group_member_... “群组成员表”

群组成员表是横向分表的一系列表,通过存储过程动态创建,这样可以避免数据过大导致的效率问题,你懂的:)

 

 

 

 

同时配合它的还有 “群组成员变化表” t_group_member_change_...

列名

说明

类型

长度

是否主键

可否为空

描述

p_group_change_id

 

 

 

 

 

p_group_change_type

 

 

 

 

 

p_group_member_change_datetime

 

 

 

 

 

p_group_id

群组ID

bigint

20

Yes

No

 

p_group_member_id

成员ID

bigint

20

Yes

No

 

p_group_member_identity

成员身份

smallint

6

 

No

 

p_group_member_join_datetime

加入时间

bigint

20

 

No

 

 

 

 

 

 

 

 

 

 

 

 

针对其操作的存储过程主要有

pr_group_member_add

pr_group_member_del

pr_group_member_get

BEGIN-- =============================================-- 创 建 人:  Snight-- 创建时间:  2012-02-20-- 功能描述: 增加新的群组成员,通过本存储过程,支持动态分表-- =============================================declarel_table_idint;-- 临时群组IDdeclarel_datetimebigint;-- 当前时间declarel_table_namevarchar(200);--表名setl_table_id =truncate(a_group_id/10000,0);--设定每10000个群组分表 精度保持哦setl_table_name='t_group_member_';--初始化表名setl_table_name= concat(l_table_name,cast(l_table_id AS char));--拼接目标表名seta_result   = 1;--返回1 表示成功-- ------------------------------ 动态处理成员表------------------------------------------ if ( exists(select table_name from information_schema.tables where table_schema = 'db_im_group' and  table_name = l_table_name) <=0 )thenset@l_sqlstr = concat('create table ',l_table_name,' (p_group_id bigint(20)    not null  ,'  ,'p_group_member_id bigint(20)    not null , ','p_group_member_identity smallint(6)   not null ,','p_group_member_join_datetime bigint(20)    not null ,','primary  key(p_group_id, p_group_member_id));');prepare stmt from @l_sqlstr;execute stmt;end if;set l_datetime= timestampdiff(microsecond,'1970-01-01 08:00:00',now())/1000 ;set@l_sqlstr =concat( '  insert into ',   l_table_name,    '  (p_group_id,  p_group_member_id,  p_group_member_identity, p_group_member_join_datetime)  ' ,    '  values(' ,   cast(a_group_id as char) ,  ',' ,   cast(a_group_member_id as char) ,  ',' ,    cast(a_group_member_identity as char) ,  ',' ,   cast(l_datetime as char) ,' );');prepare stmt from @l_sqlstr;execute stmt;-- ------------------------------ 动态处理成员表变化------------------------------------------setl_table_name='t_group_member_change_';--重置表名setl_table_name= concat(l_table_name,cast(l_table_id AS char));--拼接目标表名 if ( exists(select table_name from information_schema.tables where table_schema = 'db_im_group' and  table_name = l_table_name) <=0 )thenset@l_sqlstr = concat('create table ',l_table_name,' (p_group_change_id bigint(20) AUTO_INCREMENT primary  key ,'  ,'p_group_change_type smallint(6) not null , ','p_group_idbigint(20)  not null ,','p_group_member_id bigint(20)  not null ,','p_group_member_identity smallint(6) not null ,','p_group_member_join_datetime bigint(20)  not null ,','p_group_member_change_datetime bigint(20)  not null, ','index idx_gid_uid(p_group_id , p_group_member_id)  ',');');prepare stmt from @l_sqlstr;execute stmt;end if;set@l_sqlstr =concat( '  insert into ',   l_table_name,    '  (p_group_change_type,  p_group_id,  p_group_member_id ,  p_group_member_identity,  p_group_member_join_datetime , p_group_member_change_datetime)  ' ,    '  values(' ,   cast(1 as char) ,  ',' ,   cast(a_group_id as char) ,  ',' ,   cast(a_group_member_id as char) ,  ',' ,    cast(a_group_member_identity as char) ,  ',' ,    cast(l_datetime as char) ,  ',' ,   cast(l_datetime as char) ,' );');prepare stmt from @l_sqlstr;execute stmt;END


 

BEGIN-- =============================================-- 创 建 人: Snight-- 创建时间: 2012-02-22-- 功能描述: 删除群组成员-- =============================================declarel_table_idint;-- 临时群组IDdeclarel_datetimebigint;-- 当前时间declarel_table_namevarchar(200);--表名setl_table_id =truncate(a_group_id/10000,0);--设定每10000个群组分表 精度保持哦setl_table_name='t_group_member_';--初始化表名setl_table_name= concat(l_table_name,cast(l_table_id AS char));--拼接目标表名set@l_sqlstr =concat( '  delete from  ',   l_table_name,    '  where p_group_id ='  ,   cast(a_group_id as char)  ,    '  and p_group_member_id =  ',cast(a_group_member_id  as char) ,' ;');prepare stmt from @l_sqlstr;execute stmt;-- ------------------------------ 动态处理成员表变化------------------------------------------setl_table_name='t_group_member_change_';--重置表名setl_table_name= concat(l_table_name,cast(l_table_id AS char));--拼接目标表名 if ( exists(select table_name from information_schema.tables where table_schema = 'db_im_group' and  table_name = l_table_name) >=0 )thenset l_datetime= timestampdiff(microsecond,'1970-01-01 08:00:00',now())/1000 ;set@l_sqlstr =concat( '  insert into ',   l_table_name,    '  (p_group_change_type,  p_group_id,  p_group_member_id ,  p_group_member_identity,  p_group_member_join_datetime , p_group_member_change_datetime)  ' ,    '  values(' ,   cast(2 as char) ,  ',' ,   cast(a_group_id as char) ,  ',' ,   cast(a_group_member_id as char) ,  ',' ,    cast(1 as char) ,  ',' ,    cast(l_datetime as char) ,  ',' ,   cast(l_datetime as char) ,' );');prepare stmt from @l_sqlstr;execute stmt;end if;


 

BEGIN-- =============================================-- 创 建 人:  Snight-- 创建时间:  2012-02-20-- 功能描述:  获取成员记录集-- =============================================declarel_table_idint;-- 临时群组IDdeclarel_table_namevarchar(200);--表名setl_table_id =truncate(a_min_gid/10000,0);--设定每10000个群组分表 精度保持哦setl_table_name='t_group_member_';--初始化表名setl_table_name= concat(l_table_name,cast(l_table_id AS char));--拼接目标表名 if ( exists(select table_name from information_schema.tables where table_schema = 'db_im_group' and  table_name = l_table_name) >=0 )thenset@l_sqlstr = concat('select p_group_id,  p_group_member_id,   p_group_member_identity,  p_group_member_join_datetime from ',l_table_name,' where p_group_id>', cast(a_min_gid as char) ,' order by p_group_id  limit ', cast(a_ret_cnt as char) , ';');prepare stmt from @l_sqlstr;execute stmt;end if;END
BEGIN-- =============================================-- 创 建 人:  Snight-- 创建时间:  2012-02-20-- 功能描述:  获取变化记录集-- =============================================declarel_table_idint;-- 临时群组IDdeclarel_table_namevarchar(200);--表名setl_table_id =truncate(a_min_change_id/10000,0);--设定每10000个群组分表 精度保持哦setl_table_name='t_group_member_change_';--初始化表名setl_table_name= concat(l_table_name,cast(l_table_id AS char));--拼接目标表名 if ( exists(select table_name from information_schema.tables where table_schema = 'db_im_group' and  table_name = l_table_name) >=0 )thenset@l_sqlstr = concat('select p_group_change_id,  p_group_change_type,   p_group_id, p_group_member_id,  p_group_member_identity, p_group_member_join_datetime, p_group_member_change_datetime  from ',l_table_name,' where p_group_change_id>', cast(a_min_change_id as char) ,' order by p_group_id  limit ', cast(a_ret_cnt as char) , ';');prepare stmt from @l_sqlstr;execute stmt;end if;END

 
	
				
		
原创粉丝点击