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。
