使用 MySQL 和 ejabberd 进行高效的外部排班

2023-12-29

Question

请注意,这个问题的解决方案就在下面,使用 Eugen 的视图思想!

我正在为 PHP/MySQL 用户驱动的网站编写一个聊天模块,允许两个用户交朋友,并选择 eJabberd 作为聊天系统。

我已经使用 PHP 守护程序成功设置了外部身份验证,现在我已经成功地通过使用将友谊添加到 eJabberd 中mod_roster_odbc并填充 MySQLrosterusers手动表。经过大量挖掘,我设法找到了这个特别的评论 http://www.ejabberd.im/node/2973#comment-52164对于了解将每一列设置为什么非常有帮助,以便在聊天模块的朋友列表中表示友谊。

我当前处理友谊的方法是将两行插入到rosterusers table:

# Relationship user1 => user2
INSERT INTO rosterusers (username, jid, subscription, ask, server, type)
VALUES ('user1', '[email protected] /cdn-cgi/l/email-protection', 'B', 'N', 'B', 'item');

# Relationship user2 => user1
INSERT INTO rosterusers (username, jid, subscription, ask, server, type)
VALUES ('user2', '[email protected] /cdn-cgi/l/email-protection', 'B', 'N', 'B', 'item');

我对此不太满意,因为互惠的友谊需要两行。

据我了解,按照标准,XMPP 允许用户之间的单链接和双链接。根据我的问题的性质,人们可能会推断出,我自己的应用程序的朋友系统使用一行来代表友谊。

我的主要问题:

  1. 是否有可能将这种友谊巩固为一排?我尝试了一些组合非官方文档 http://www.ejabberd.im/node/2973#comment-52164但还没有成功。我正在通过使用 Pidgin 客户端连接到我的 XMPP 服务器进行测试。
  2. 保持两个数据库(朋友和 XMPP 花名册)同步的最佳方法是什么?我认为MySQLTRIGGER可能是目前最干净的选择。

如果没有,那么我的另一个选择是改变rosterusers表并让它引用我自己的应用程序的朋友行,以便它的功能类似于跨数据库外键。

解决方案代码

我按照尤金的建议创建了一个视图。该代码不是最优雅的,但我已经对其进行了测试,它可以与 MySQL 5.5 上的 eJabberd 2.1 一起使用。

我的确切设置使用两个数据库,因此我通过使用显式引用我的主应用程序的数据库main_database.table_name.

该代码是两个查询的联合 - 第一个查询获取 User, Friend,然后第二个查询插入 Friend, User。我在用着UNION ALL为了速度,并让“重复”通过。

我认为这是处理问题的一种非常好的方法,因为不需要对应用程序进行任何更改,并且它会立即更新。

CREATE VIEW rosterusers AS

SELECT LCASE(ua1.Username) AS `username`, CONCAT(LCASE(ua2.Username), '@myserver.org') AS `jid`,
'B' AS `subscription`,
'N' AS `ask`,
'N' AS `server`,
'item' AS `type`,
'B' AS `subscribe`,
d1.Created AS `created_at`,
ua2.Username AS `nick`,
'' AS `askmessage`

FROM main_database.User_Friend AS `d1`

INNER JOIN main_database.User AS `ua1` ON `d1`.UserID = `ua1`.ID
INNER JOIN main_database.User AS `ua2` ON `d1`.FriendID = `ua2`.ID

WHERE d1.IsApproved = 1

UNION ALL

SELECT LCASE(ub2.Username) AS `username`, CONCAT(LCASE(ub1.Username), '@myserver.org') AS `jid`,
'B' AS `subscription`,
'N' AS `ask`,
'N' AS `server`,
'item' AS `type`,
'B' AS `subscribe`,
d2.Created AS `created_at`,
ub1.Username AS `nick`,
'' AS `askmessage`

FROM main_database.User_Friend AS `d2`

INNER JOIN main_database.User AS `ub1` ON `d2`.UserID = `ub1`.ID
INNER JOIN main_database.User AS `ub2` ON `d2`.FriendID = `ub2`.ID

WHERE d2.IsApproved = 1;

IIUC,表rosterusers从您的 POV 来看是只读的eJabberd服务器应用程序。这将使事情变得简单,将其替换为view,这会在您自己的朋友表中的 1 行中创建所需的 2 行。

不知道你自己的友谊表的结构,我无法给你完整的代码,但这是我认为的伪 SQL

CREATE VIEW rosterusers AS SELECT * FROM (
    SELECT 
        selfuser.name AS username, 
        frienduser.jid AS jid,
        -- ....,
        selfuser.jid AS jid_as_id
    FROM
        users AS selfuser
        INNER JOIN friendships ON ....
        INNER JOIN users AS frienduser ON ...
    UNION SELECT 
        frienduser.name AS username, 
        selfuser.jid AS jid,
        -- ....,
        frienduser.jid AS jid_as_id
    FROM
        users AS selfuser
        INNER JOIN friendships ON ....
        INNER JOIN users AS frienduser ON ...
);

and then

SELECT
    username, jid, subscription, ask, server, type
FROM rosterusers
WHERE jid_as_id='[email protected] /cdn-cgi/l/email-protection'

应该给你 2 行,每个部分各一行UNION在视图中

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 MySQL 和 ejabberd 进行高效的外部排班 的相关文章

  • 研究MySQL、SQLite源码了解RDBMS实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道实现数据库是一个很大的话题 但我想通过研究数据库系统的源代码来基本了解数据库系统的工作原理 例如
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v
  • MySQL 中 INDEX、PRIMARY、UNIQUE、FULLTEXT 之间的区别?

    创建MySQL表时PRIMARY UNIQUE INDEX和FULLTEXT有什么区别 我将如何使用它们 差异 KEY or INDEX指的是普通的非唯一索引 索引的非不同值是允许的 因此索引may索引的所有列中包含具有相同值的行 这些索引
  • 统计mysql中的总行数并按列分组

    所以我已经看这个有一段时间了 但我似乎无法弄清楚 我有一个具有以下格式和示例数据的 mysql 表 ID Customer Time Error Code Duration 1 Test1 00 12 00 400 120 2 Test2
  • 无法从我的 java 应用程序访问 mysql 数据库(在 AWS 实例上运行)

    我有一个在 AWS EC2 Ubuntu 实例上运行的 xampp 服务器 并且那里有一个名为 androiddb 的数据库 我可以通过在导航器中写入来访问数据库http public ip phpmyadmin http public i
  • 如何将条件聚合 mysql 转换为 laravel 查询?

    我的sql查询是这样的 SELECT a number a description MAX CASE WHEN b attribute code brand then b attribute value END as brand MAX C
  • 由于缺少 PHP 扩展,CakePHP 3 无法连接到数据库

    我正在尝试使用 WT NMP 安装 cakePHP 3 0 0 但收到以下消息 CakePHP 无法连接到数据库 由于以下原因无法使用数据库驱动程序 Cake Database Driver Mysql 缺少 PHP 扩展或未满足的依赖项
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • mysql 详细查询字符串,如通配符

    不知道如何标题我的问题 哈哈 下面是我需要的 我的数据库中的值如下所示 test example 1 test example 2 test example TD 1 这些值的长度可以不同 test example 只是一个示例 某些值将具
  • 如何使用php在mysql数据库中添加照片? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我对 PH
  • 如何检查一个值是否已经存在以避免重复?

    我有一个 URL 表 但我不想要任何重复的 URL 如何使用 PHP MySQL 检查给定 URL 是否已在表中 如果您不想重复 可以执行以下操作 添加唯一性约束 use REPLACE http dev mysql com doc ref
  • 连接 3 三张表

    我有这个图表应该可以解释我的情况 我需要一些关于连接 3 个表的帮助 我不知道如何做这种事情 因此 我可以通过执行以下操作来经历一段检索记录的 while 循环 img src alt Album AlbumID 使用内部联接 http w
  • Innodb页面大小设置

    在innodb中 页面大小默认为16kb 如何将页面大小设置为 8kb 是否有在源编译步骤中设置的选项 您不需要在源编译步骤中指定页面大小 MySQL 5 6 及更高版本支持不同的页面大小 无需重新编译 但是 您必须在初始化 InnoDB
  • mod_rewrite, .htaccess 连接mysql数据库

    我希望 htaccess 文件中的 mod rewrite 链接到 mysql 数据库以向我提供映射信息 具体来说 我使用单个代码库来托管多个站点 因此 如果用户请求图像 例如 http www example com images car
  • 如何在 Laravel 5 中使用 Orchestral/Tenanti 构建具有多个数据库的多租户应用程序?

    我正在尝试使用 Laravel 5 构建和应用程序 它应该是使用多个数据库的多租户数据库架构 我的雇主出于安全目的要求这样做 我尝试手动管理主数据库迁移和租户迁移 但失败了 所以我决定借助 Laravel 特定包的帮助 这应该是我所需要的
  • 主键默认可以为NULL吗?为什么这样描述呢?

    我有一张桌子 当我describe这是 mysql gt DESC my table Field Type Null Key Default Extra contact id int 11 NO PRI NULL auto incremen
  • MySQL SELECT OpenCarts 数据库中的重复行

    只是玩一下 OpenCart DB 看看我是否能学到一些东西 如果我使用以下SELECT结果返回重复的行 SELECT DISTINCT p product id AS pid p model AS modelo SUBSTRING p m
  • 登录异常 SASL 身份验证在 android 中使用 DIGEST-MD5 asmack 机制失败

    我尝试连接 Xmpp 服务器 但出现异常 登录异常 SASL 身份验证使用 DIGEST MD5 机制失败 我使用这个代码 任何人都可以帮助我 或者代码 try if xmppConnection null ConnectionConfig
  • MySQL,连接两列

    MySQL 表中有两列 SUBJECT and YEAR 我想生成一个字母数字唯一编号 其中包含主题和年份的串联数据 我怎样才能做到这一点 是否可以使用像这样的简单运算符 您可以使用CONCAT http dev mysql com doc
  • Mysql 将 --secure-file-priv 选项设置为 NULL

    我在 Ubuntu 中运行 MySQL 我在运行特定的查询集时收到此错误 MySQL 服务器正在使用 secure file priv 选项运行 因此无法执行此语句 当我这样做的时候SELECT secure file priv 在我的 m

随机推荐

  • 关于c中的表达式“&anArray”

    首先 我读到 array array array 0 只要 array 确实是一个数组 一切都会相同 所以我尝试 int main char ar a b c 0 printf argument ar s n ar printf argum
  • 迁移中如何使用DbContext?

    我该如何使用DbContext它适用于当前数据库 现在在迁移中使用 Example namespace Data SqlServer Migrations DbContext typeof MyDbContext I want use th
  • 如何编译使用 hamcrest 'is' 的 Kotlin 单元测试代码

    我想为我的 Kotlin 代码编写一个单元测试并使用 junit hamcrest 匹配器 我想使用is方法 但它是 Kotlin 中的保留字 我怎样才能编译以下内容 class testExample Test fun example a
  • 在 Delphi 中使用 dispInterface 且没有 classid

    我已将一个类型库导入到具有许多调度接口的 Delphi XE2 中 他们中的大多数都有一个自动创建的组件类并自动创建相应的delphi T 接口 然而 我需要使用的一些调度接口没有 classid 我已经尝试了在网上可以找到的所有示例来利用
  • MOTODEV Studio 与 SDK 安装有关的问题

    我以前有 Java 编程经验 并且还接受过大学 Java 培训 因此我希望使用 Android 进行一些 Java 应用程序开发 为此 我从 Motorola 下载并安装了 MOTODEV studio 它部分基于 Eclipse 不过默认
  • 使用 Redirect 与 RewriteRule 的速度影响

    我很想知道 Apache 上 htaccess 规则中的 RewriteRules 和 Redirect 之间的速度是否有任何差异 在我看来 RewriteRules 通常可以是复杂的正则表达式 我认为与 Redirect 相比 它有开销
  • URI 太长时 Chrome 崩溃

    我正在为我的 HTML5 游戏制作一个导出功能 我当前的保存方法是游戏数据的粗略序列化 然后 this is Javascript var gameData abc this is actually a HUGE string of ove
  • 使用 PHP 从 Youtube 视频 URL 获取 Youtube 视频缩略图

    假设我有一个 YouTube 视频网址www youtube com watch v B4CRkpBGQzU feature youtube gdata par1 1 par2 2 我想获取视频缩略图 gt i3 ytimg com vi
  • Android Espresso IdlingResources 和片段/活动转换

    我有一个托管片段 F1 的活动 单击按钮后 F1 被另一个片段 F2 替换 当按下后退按钮时 应用程序通过一个按钮从 F2 返回到 F1退出过渡动画片 我的 Espresso 测试用例大致如下所示 Test public void pres
  • Django 和 MySQL unicode 错误

    我正在得到一个Incorrect string value Exception Value Incorrect string value xEA xB0 x95 xED x95 x98 for column object repr at r
  • 如何将存储过程的多个输出抓取到临时表中

    我的存储过程返回两个输出 我想在另一个存储过程中使用其中一个 因此尝试获取临时表中的第二个输出 但由于两个输出的结构不同 因此我总是得到 列名称或提供的值的数量与表定义不匹配 即使我更改输出的顺序 第一个输出第二个 第二个输出第一个 它也不
  • 如何在R中保存foreach循环的输出

    我在保存数据输出后遇到问题foreach loop 这是读取我的数据并处理它的函数 readFiles lt function x data lt read table filelist skip grep Begin Data Text
  • Java 中最终字符串的串联是如何完成的?

    当我编译这个片段时 public class InternTest public static void main String strings final String str1 str final String str2 ing Str
  • Netbeans 中的 Git 控制台

    我刚刚安装了 Netbeans 8 我想开始使用 Git 有很多按钮 菜单等 但在哪里可以找到 Git 控制台 我使用Windows 如果您想要控制台 您可能最好直接安装它 IDE 通常只提供菜单集成选项 Git 的网站有 Windows
  • Symfony2主义mysql IN查询

    我有一系列产品 ID 我必须像这样进行查询 SELECT FROM products WHERE pid IN 1 2 8 4 etc 我的 id 位于变量 pids 中 qb em gt createQueryBuilder query
  • 如何使用 Amazon AWS Elastic Beanstalk 安装 PHP 扩展?

    我们在 EC2 实例上的 PHP 应用程序中使用 aws elastic beanstalk 由于我们选择了负载平衡 它会不断地更改实例 我想知道如果我们安装 PHP 插件 它会受到实例更改的影响还是在新实例中也可用 提出这个问题是因为我们
  • macOS 上 CLion 中的 std::unordered_map

    我怎样才能看到元素std unordered map在 CLion 调试器中 有一些recipe https blog jetbrains com clion 2015 05 debug clion 怎么看std map元素 但它不适用于s
  • 添加两个 NSDate

    我有两个 NSDate 日期和时间 我想以这样的方式添加它们 以便我从日期中获取日期 从时间中获取时间 关于我如何做到这一点有什么建议吗 Cheers Nik 如果我没听错的话NSDates dateByAddingTimeInterval
  • 在 Symfony 1.4 中重命名“web”文件夹

    我想在 symfony 1 4 中将 web 文件夹重命名为 html 不幸的是 搜索这方面的文档却一无所获 除了在 1 0 中如何实现这一点之外 这似乎不起作用 首先 您不必重命名它 您可以只创建一个符号链接 除非您运行的是 Window
  • 使用 MySQL 和 ejabberd 进行高效的外部排班

    Question 请注意 这个问题的解决方案就在下面 使用 Eugen 的视图思想 我正在为 PHP MySQL 用户驱动的网站编写一个聊天模块 允许两个用户交朋友 并选择 eJabberd 作为聊天系统 我已经使用 PHP 守护程序成功设