【问题标题】:In Java, mutiple select queries or join, which one would be a better practice?在 Java 中,多个选择查询或连接,哪个是更好的做法?
【发布时间】:2020-08-18 12:23:46
【问题描述】:

我在 MySQL 数据库中有五个表,每个表都与存储用户名和密码的 User 表具有一对一的关系,User 表中有一个 user_id 字段作为所有其他表的外键.

如果我需要用Java实现“登录”功能,从这五个表中获取某个用户的所有数据,使用JOIN一次查询这五个表是一个好习惯吗?

我还有一个问题,将这五个表合并为一个表会更好吗,因为它们是一对一的关系?

【问题讨论】:

  • 注意:不要存储纯文本密码。使用密钥派生函数或至少使用每个用户唯一的盐进行加盐散列。

标签: java mysql database join


【解决方案1】:

作为一般原则,1对1的关系应该在同一个表中。

例外情况可能包括:

  • 权限分离——mysql用户拥有不同的表级访问权限。
  • 锁定分离,一个表作为一个特别高的更新字段,而不是一个需要与另一个表分离的用户ID 高用户 ID 更新。
  • 性能 - 行大小 - 一张表有大量不经常需要的列,因此请通过以下方式将其排除在 innodb 缓冲池之外 将这些列保存在不同的表中。

【讨论】:

  • 感谢您的回复!在这种情况下,出于性能考虑,我将表分成多个不同的表。如果我还有一些其他表与主用户表具有一对多关系,是否有一种有效的方法来查询所有这些数据?
  • 我应该量化性能,这确实适用于相当特殊的情况。不要仅仅因为你认为它会更好而使用它。您只会遇到这种情况,即您在 innodb 缓冲池上运行高周转率,而较少使用的字段非常大且大部分未使用。对于一对多,请确保您have the right indexes。 [DBA 交流](dba.stackexchange.com/) 是一个更专注于数据库的论坛。
【解决方案2】:

使用外键引用创建多个表背后的想法是支持一对多关系。由于您的表数据是一对一的关系,如果包含所有表的列数(具有一对一关系)小于 Mysql 表列数限制,则创建多个表是没有意义的。

如果您的业务需求不允许更改当前架构,您可以通过 join 来在单个网络调用中获取所有数据,而不是通过多个网络调用来获取数据,因为网络调用延迟是不可预测的。

【讨论】:

  • 感谢您的回复!将它们拆分为多个表的原因是因为某些列不像其他列那样经常使用。但是,看起来使用 JOIN 将这五个表一起查询似乎是一种合理的方式。如果我有几个与 User 表具有一对多关系的表,那么使用 JOIN 会是查询它们的有效方法吗?
  • 如果表以适当的方式创建并具有所需的约束/索引,数据库引擎会尝试以最佳方式获取数据,并且将远远优于不可预测的多个网络调用。
猜你喜欢
  • 2013-09-23
  • 2010-12-28
  • 2010-11-20
  • 2011-12-16
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 2016-09-19
相关资源
最近更新 更多