邮件标签的实现方法

功能说明:

像QQ邮箱的标签功能,通过标签管理邮件,便于对邮件分类。一般有如下要求:

1) 增加、删除、修改标签

2) 对邮件标记多个标签,形成邮件和标签多对多的关系

3) 查看标签列表,并且可实时显示每个标签下的邮件数量

4) 查看某个标签下的邮件列表

5) 邮件列表可看到邮件已标记的标签

6) 可建收信规则,对于某种条件标记一个或多个标签

7) 删除标签时,不删除标签下的邮件

实现说明:

标签信息表:

label_id->label_detail_info(标签id为主键,映射标签详细信息,包括标签名等)

这个表可满足要求 1) 3),标签id递增生成,可满足 6)

邮件信息表:

user_id+message_id->messge_detail_info(用户和邮件id为主键,映射邮件详细信息,包括邮件所标记的标签label_id_list,发信时间等)

方法1:

1,label_id_list保存为字符串,如某封邮件标记有多个标签,则label_id_list为 '1,2,3',通过标签id获取标签名称,这样可满足要求 2) 5)

2,另外再建一个标签对应邮件的表,如label_id->message_id,通过message_id可以获取邮箱信息,可满足 4)

3,删除标签时,通过标签对应邮件的表找出邮件,修改邮件的label_id_list

优缺点:

1,可创建任意多个标签

2,需多维护”标签对应邮件的表“,对邮件标记标签时,修改label_id_list后需增加label_id->message_id的映射,保证原子操作较困难

3,删除标签后,需修改邮件的label_id_list

方法2:

1,label_id_list保存为long int,每个bit对应一个标签,如label_id_list=7表示为 '1,2,3',通过标签id获取标签名称,这样可满足要求 5)

2,其他和方法1一样

优缺点:

1,由于long int只有64个bit,所以最多只能建64个标签。其他和方法1一样,该方法限制了建标签的数量,所以用方法1也不用方法2。

方法3:

1,对邮件所标记的标签组合创建索引表,称为标签id映射表,该表有3列

label_map_id(int,递增,主键),user_id,label_id_list(varchar)

label_id_list是字符串类型,用逗号分隔的标签id,如'1,3,5',已经排好序的

对user_id创建索引,用于查找某用户使用的标签组合

由于该表的label_id_list只用于查询标签组合是否包含某标签id,并且单个用户使用的标签组合不会很多,所以不需要对user_id+label_id_list建索引

如 100->'1,2,3'

2,邮件信息表的label_id_list保存为label_map_id,如某封邮件标记的标签是'1,2,3',则邮件信息表的label_id_list的值为100

3,在邮件信息表对user_id+label_id_list创建索引

4,删除标签时,检查标签id映射表内的label_id_list删除将被删除的标签id

5,删除邮件时,检查是否还有邮件使用将被删除邮件的label_id_list,如果没有,则在标签id映射表删除相应记录。比如如果没有邮件再使用100,则将100删除

优缺点:

1,可创建任意多个标签

2,对邮件标记标签,取消标记标签,删除标签等操作都比较简单

3,需多维护”标签id映射表“,但修改标签的操作不频繁,并且修改该表不影响到原子操作,所以维护该表不麻烦


猜你喜欢

转载自cloudmail.iteye.com/blog/1403072
今日推荐