关于Ejabberd联系人列表按实体分组及关联展示的技术咨询
实体维度联系人列表实现方案
核心规则梳理
先明确业务核心逻辑:
- 系统包含两种实体:
EntityType1(可关联EntityType2)、EntityType2 EntityType1关联EntityType2后,其所属用户可与自身实体用户+所有关联EntityType2的用户聊天- 用户可拥有多个
EntityType1权限,切换实体身份时,仅展示对应实体及关联实体的可聊天用户
数据模型设计(关系型数据库示例)
1. 基础实体表
- entity表:存储所有实体的基础信息
字段名 类型 说明 id 主键 唯一实体ID type 枚举 实体类型(ENTITY_TYPE1/ENTITY_TYPE2) name 字符串 实体名称(如EntityType-1.1)
2. 用户-实体权限关联表
- user_entity_rel表:记录用户拥有的实体访问权限
字段名 类型 说明 user_id 外键 用户ID entity_id 外键 实体ID role 字符串 用户在实体中的角色(可选)
3. EntityType1-EntityType2关联表
- entity1_entity2_rel表:记录两类实体的关联关系
字段名 类型 说明 entity1_id 外键 EntityType1的ID entity2_id 外键 EntityType2的ID create_time 时间戳 关联创建时间
业务逻辑实现(后端示例)
1. 获取用户可切换的实体身份
根据用户ID查询user_entity_rel表,筛选出所有类型为ENTITY_TYPE1的实体,作为用户的身份切换选项。
2. 计算当前身份下的可聊天用户
当用户选定某个EntityType1身份(记为current_entity1)时,执行以下步骤:
- 提取当前
EntityType1的所有用户:从user_entity_rel表中筛选entity_id=current_entity1.id的用户集合 - 提取所有关联的
EntityType2实体:从entity1_entity2_rel表中获取current_entity1关联的所有entity2_id列表 - 提取关联
EntityType2的所有用户:遍历上述entity2_id列表,从user_entity_rel表中筛选对应用户 - 合并去重:将前两步的用户集合合并,去除重复项(比如用户同时属于多个实体的情况)
伪代码示例
def get_chat_contacts(user_id, current_entity1_id): # 1. 获取当前EntityType1下的用户 entity1_users = query("SELECT user_id FROM user_entity_rel WHERE entity_id = %s", current_entity1_id) # 2. 获取关联的EntityType2列表 related_entity2_ids = query("SELECT entity2_id FROM entity1_entity2_rel WHERE entity1_id = %s", current_entity1_id) # 3. 获取所有关联EntityType2的用户 entity2_users = [] for entity2_id in related_entity2_ids: users = query("SELECT user_id FROM user_entity_rel WHERE entity_id = %s", entity2_id) entity2_users.extend(users) # 4. 合并去重并返回用户详情 all_user_ids = list(set(entity1_users + entity2_users)) return query("SELECT id, name FROM user WHERE id IN %s", tuple(all_user_ids))
前端展示建议
- 顶部设置实体身份切换下拉框,展示用户拥有的所有
EntityType1实体 - 切换身份时,调用后端接口重新加载联系人列表,按实体分组展示(如「当前实体用户」「关联EntityType2.1用户」)
- 对当前登录用户做特殊标记(如高亮、标注「我」)
性能优化点
- 给
user_entity_rel表的entity_id和user_id字段建立联合索引,加速查询 - 缓存用户的实体权限列表和关联关系,有效期设为15-30分钟,减少重复查询
- 使用JOIN语句合并多表查询,减少数据库交互次数
内容的提问来源于stack exchange,提问作者Pinank Lakhani
相关产品推荐
相关产品推荐

