如果我的用户存储在另一个数据库中,我应该在使用SQL数据库的服务中复制它们吗?

时间:2018-05-31 14:48:42

标签: mysql sql postgresql microservices

如果我的用户存储在其他数据库中,但我在SQL数据库中构建帖子,我应该创建另一个表users吗?

如果我这样做,我会复制我的所有用户,并且必须确保它与其他数据库保持同步,但另一方面,我的帖子表可以通过引用fk而不是完整id来节省空间每次都是字符串。

建议是什么?创建另一个表users或只是传入用户ID进行查询?

2 个答案:

答案 0 :(得分:1)

如果您拥有存储和提供有关用户信息的服务,则需要该信息的其他服务应与用户服务进行通信以获取该信息。也就是说,可能是用户服务首先存在的原因。

根据用户列表的波动性以及在帖子服务中要遵守的更改要求,您可能会考虑在帖子服务中进行一些短期缓存,但我当然不会保留另一个用户副本在那里列出。

答案 1 :(得分:0)

有3种明显的解决方案。

最简单,最简洁,最快捷的方法是在“posts”数据库和“用户”数据库之间使用外键和连接。在这种情况下,当您显示帖子列表时,您可以在一个查询中同时获取帖子和用户数据,而且无需保持最新状态。

下一个选项是在帖子旁边存储用户数据的副本。这导致娱乐失败模式 - 用户数据库中的数据可能不同步。但是,这在使用第三方身份验证系统时是一种相当常见的策略(例如,使用您的Google / Facebook / Github / Stack Exchange凭据登录)。实现这项工作的方法是尽量减少您复制的数据量,并在它过期时保证安全。例如,用户的显示名称可能没问题;目前的银行账户余额可能不是。

最后一个选项是将用户的主键存储在posts数据库中,并在运行时检索用户数据。这不太可能导致数据不同步的错误,但它可能会导致性能问题 - 逐个检索1000个帖子的用户详细信息显然比通过联接查询检索所有内容慢得多。

然后选择“我有一个服务,它结合了帖子和用户数据,我的UI从该服务检索所有内容,或者我让UI检索帖子,然后是每个帖子的用户”。这主要取决于应用程序的使用情况,以及是否可以使用异步调用来检索用户信息。如果可能的话(假设您正在构建Web应用程序),最简单的选项可能是返回帖子和用户ID,并根据需要使用Ajax请求来检索用户数据。

CQRS approach(微服务架构常见)为此提供了一些结构。