数据库中有多个table个副本方便join查询还是在程序中做数据关联?

have multiple table copies in databases for easy join query or do data associate in program?

在使用多个数据库的大型系统中。

例如:

db_trade用于交易信息存储

db_fund 用于用户帐户存储

db_auth用于认证授权

在这种情况下 user_info 是常见信息。

交易系统资金系统 UI需要显示交易或账户信息和用户信息。为了更好的性能,它需要执行 sql query left join user_info.

我不知道如何在更大的系统中设计:

在程序中进行数据关联? 在每个数据库中同步 user_info table ?

每种方法各有利弊:

规范化方法将每条数据恰好存储一次,从数据完整性的角度来看更好。这是关系数据库设计中使用的传统方法。例如,在银行系统中,您可能不会将经常账户余额保存在多个地方,对吧?因为当你在一个地方改变它时,另一个地方就会变得不一致,这可能会导致错误的业务决策。

非规范化方法允许在不同位置存储相同数据的多个副本,并且性能更好。这是通常推荐用于大数据和 NoSQL 数据库设计的方法。一个有意义的例子:假设你正在设计一个聊天系统,你需要在消息作者的名字旁边显示消息。您可能更愿意在消息旁边存储显示名称,而不仅仅是用户 ID,这样您就不需要在每次显示消息时都执行昂贵的加入操作。

如果进行非规范化,则需要在应用程序级别处理数据完整性。首先,您需要确保您清楚什么是真相的来源。可以准备好多个 user_info 的副本以低延迟获取,但应该有一个地方可以找到最正确的 up-to-date 用户信息。这是用户信息的主 table。用户信息的其他副本应该从中派生。所以你必须决定你设计中的哪个数据库是用户信息的Master。

最终,你必须在一致性和性能(与可用性密切相关)之间做出权衡。 如果 user_info 没有太大变化,并且您有很多查询和很多用户,并且性能是您的主要关注点 - 使用非规范化方法并在每个中同步 user_info table数据库。您的应用程序必须根据需要通过 database-level 复制或某些应用程序逻辑使这些 table 保持一致。

如果您必须在每个查询中对 user_info 具有高度一致的视图(这不是典型情况),您可能需要牺牲性能并将所有用户信息保存在一个位置。

通常,大数据系统为了性能和可用性而牺牲一致性。