IM实现联系人及联系人分组的数据库设计
openfire中通过ofgroup/ofgroupprop/ofgroupuser实现组织结构中的分组,通过ofroster/ofrostergroups实现好友关系中的分组。但是呢,我们做二次开发的时候,希望能够有自己的个人联系人及分组,它没有确认过程,也就是说,只要我愿意,我可以将任何组织结构中的用户添加到自己的任何联系人分组中。那么我们设计如下:
两张表ofprivateuser/ofprivategroup,前者记录联系人信息,后者记录分组信息。
ofprivateuser:userid(primary key)(用户id), groupid(primary key)(组id), permission(组拥有者对用户的权限)
ofprivategroup:groupid(primary key)(组id), name(组显示名称), owner(组拥有者)
备注:userid一般为username,可索引到ofuser表中的用户记录。owner表示,分组是属于哪一个用户的。
对于如此设计,大家可能会有如下疑问:
1.一个联系人可以属于多个分组吗?
答:可以。比如ofprivateuser: (userid,groupid,permission)为(zhangsan,group001,1)以及(zhangsan,group002,1)。则表示,zhangsan既属于group001又属于group002。
2.一个用户如何查询自己的全部分组及分组下的联系人?
答:通过owner字段在ofprivategroup中找到他名下的所有分组,再通过groupid字段在ofprivateuser中找到每个分组下的所有用户。
3.ofprivateuser表中,groupid是不是外键?
答:算是的,外键的作用是让两张表形成关联且外键只能引用外表中指定列的值。但是,我们也可以不将其设为外键,groupid是不是外键对我们编程没有影响。外键是数据库一级的完整性约束,就是书中说“参照完整性”的数据库实现方式。外键属性去掉后,DBMS不会对录入的数据进行“参照完整性”检查,仅此一点影响。
4.修改组名方便吗?移动联系人的分组方便吗?
答:方便,均只需要改动数据表中的一条记录。修改组名,直接操作ofprivategroup中groupid对应的name;移动联系人分组,直接操作ofprivateuser中userid对应的groupid。