如何从两个不同的表中保持两个不同的列同步?

时间:2018-04-15 18:12:05

标签: node.js postgresql database-design

我有一个users表,我有一个oauth表。 oauth表包含三列:

  • USER_ID
  • oauth_id
  • oauth_provider

oauth表的目的是将提供者ID链接到内部用户ID,并为每个用户提供唯一标识符。 我正试图将自己置于可以将id的{​​{1}}列与users的{​​{1}}同步的情况。 我试过的东西:

节点环境,node-postgres作为DB客户端。

user_id

这是有风险的,如果同时完成两个请求,则无效。 处理这种情况的方法是什么?感谢。

修改

我想我找到了一个解决方案,这个线程安全吗?

oauth

2 个答案:

答案 0 :(得分:0)

作为您提出的解决方案的替代方案,您可以使用CTE在单个SQL语句中执行两个插入:

WITH userinsert AS (
    INSERT INTO users(display_name, phone_number, is_driver) 
       VALUES ($1, $2, $3) RETURNING id
)
INSERT INTO oauth(user_id, oauth_id, oauth_provider) 
    VALUES ((SELECT id FROM userinsert), $4, $5);

答案 1 :(得分:0)

您能否绝对保证此功能是现在和将来将新记录写入Users表的唯一方法?是的,我没想过。

为什么不想创建一种方法来保证写入Users表的任何记录,应用程序中任何位置的任何其他函数或任何未来应用程序或任何数据库开发人员或DBA运行的任何脚本还会为Oauth表生成相应的记录吗?

要做到这一点,只需在Users表上创建一个after insert触发器,将正确的行插入Oauth表中。然后,无论新用户如何创建,都会创建匹配的身份验证条目。

从应用程序的角度来看,还有一个额外的好处,即两个插入都成为同一事务的一部分。因此,将行写入任一表的任何问题都会生成一个异常和一个回滚,这意味着不会对任何一个表进行任何更改。这大大简化了错误处理。

当您这样做时,创建一个before delete触发器,以便在删除用户时删除相应的Oauth条目。同样的好处。

然后你永远不必担心Oauth表与Users表保持同步。 (对于不同程度的从不,也就是说。但它会非常接近。)

一般经验法则:以尽可能低的水平执行必要的操作。应用程序代码和存储过程是高级别的,触发器,检查约束和域定义都是低级别的。