node.js - 我如何在社交媒体演示应用程序中使用 sequelize 在数据库中实现友谊功能

标签 node.js postgresql express sequelize.js

我正在构建一个社交媒体演示应用程序并向该应用程序添加好友功能。
在数据库中,我正在考虑制作新表( Sequelize 中的模型),其中包含 user1 id 和 user2 id 以及一个带有一个字符的状态(接受、拒绝等)。
我尝试实现它,但遇到了一些问题:现在我需要唯一的 key ,但用户 1 和用户 2 的组合(用户 1 和用户 2 id 对)。
我如何使用 sequelize 实现这样的东西,而且我认为这不是最好的方法,所以如果你有更好的方法,请告诉我,谢谢。

最佳答案

您的描述有些欠缺,缺少一些组件。但是很清楚地看到你在描述什么
是多对多 (m:m) 关系。只是双方来自同一张 table 。虽然不是最常见的关系,
也不是太不寻常。此外,分辨率与任何其他 m:m 相同。创建另一个具有双方 key 的表
作为外键。组合 (parent1, parent2)(P1,P2) 和组合 (P2,P1) 有一个稍微不寻常的转折
应该被认为是一样的。这给规范带来了轻微的扭曲;而不是从父列生成 PK
PK 将只是生成序列(从技术上讲,除非有预期的子表,否则不需要 PK)。
然后我们在有序对 (P1,P2) 上创建一个唯一索引。所以沿着这条线的东西:

create table friends( f_id integer generated always as identity
                    , user_id_1 integer  not null 
                    , user_id_2 integer  not null
                    , status  varchar(1) not null default 'P' 
                    , friends_since date not null default now()::date  
                    , constraint friends_pk primary key(f_id)
                    , constraint f2user_1_fk foreign key(user_id_1)
                                 references users(user_id)
                    , constraint f2user_2_fk foreign key(user_id_2)
                                 references users(user_id) 
                    , constraint cannot_friend_self
                                 check (user_id_1 != user_id_2)
                    );
--
-- unique index to recognize (P1,P2) = (P2,P1)                  
create unique index already_friends on friends  
        ( least(user_id_1,user_id_2), greatest(user_id_1,user_id_2) ); 
有关示例,请参阅 fiddle here。 Friends 表的双向性质导致查询中的额外复杂性。通常我会在 SQL 函数中隐藏复杂性。我还添加了一些有用的功能。您应该能够使用这些作为示例。请注意,由于它们是 SQL 函数,因此您可以提取语句并将其转换为参数化查询。

抱歉,我不知道 sequelize,所以我不会猜测翻译,但似乎互联网上有很多关于上述所有内容的例子。

关于node.js - 我如何在社交媒体演示应用程序中使用 sequelize 在数据库中实现友谊功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64081183/

相关文章:

javascript - 删除/替换 Unicode 字符 javascript

node.js - 在 expressjs PEM 例程 :PEM_read_bio:no start line 上设置 https

sql - 如何从数据库中删除除最大日期外具有相同日期的数据。 rails 3

sql-server - 串行 SqlContext 错误。步骤 'connecting' 失败

javascript - 在 Node.js 中从客户端向服务器发送 HTTP2 中的多个 JSON 数据

postgresql - 在 Docker Compose 中更改 postgres 容器服务器端口

sql - 将子查询转换为自连接

javascript - Monkeypatch 重新发送

javascript - 检测原始数据的变化

javascript - 在 Express 中显示每个请求的日志时间?