邮件标签的实现方法
功能说明:
像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映射表“,但修改标签的操作不频繁,并且修改该表不影响到原子操作,所以维护该表不麻烦