gpt4 book ai didi

mysql - 当其他表可以使用联接连接时,在单个表中拥有多个外键是好还是坏?

转载 作者:可可西里 更新时间:2023-11-01 07:48:10 25 4
gpt4 key购买 nike

假设我想创建一个数据库,用于跟踪用户的银行账户和交易。可用于支票簿应用程序的数据库。

如果我有一个用户表,具有以下属性:

  1. 用户编号
  2. 电子邮件
  3. 密码

然后我创建一个可以链接到特定用户的帐户表:

  1. 帐号编号
  2. 账户描述
  3. 账户余额
  4. 用户编号

为了进行下一步,我创建了一个事务表:

  1. 交易编号
  2. 交易描述
  3. is_withdrawal
  4. account_id//这笔交易所属的账户
  5. user_id//这笔交易所属的用户

在事务表中使用 user_id 是一个好的选择吗?如果我想获取每个用户的所有交易,这将使查询更清晰,例如:

SELECT * FROM transactions
JOIN users ON users.user_id = transactions.user_id

或者,我可以从帐户表追溯到用户表

SELECT * FROM transactions
JOIN accounts ON accounts.account_id = transactions.account_id
JOIN users ON users.user_id = accounts.user_id

我知道第一个查询要清晰得多,但这是最好的方法吗?

我担心的是,通过在事务表中添加这个额外(冗余)列,我在浪费空间,而我可以在没有所述列的情况下获得相同的结果。

最佳答案

让我们换个角度来看。查询或一系列查询将从哪里开始?如果您有客户信息,则可以获取帐户信息,然后获取交易信息或仅获取每个客户的交易信息。您需要所有三个表来获取有意义的信息。如果您有帐户信息,您可以获得交易信息和指向客户的指针。但是要获取任何客户信息,您需要转到客户表,因此您仍然需要所有三个表。如果您有交易信息,您可以获取帐户信息,但如果没有客户信息,那将毫无意义;或者您可以在没有帐户信息的情况下获取客户信息,但没有帐户数据,每个客户的交易都是无用的噪音。

无论采用哪种方式,任何可能用途所需的信息都被分成三个表,您必须访问所有三个表才能获得有意义的信息,而不仅仅是数据转储。

在交易表中拥有客户 FK 可能会为您提供一种进行“干净”查询的方法,但该查询的结果是否有用值得怀疑。所以你真的一无所获。我曾为一家国际信用卡公司编写反洗钱 (AML) 扫描程序,所以我不是在假设。无论如何,您总是需要所有三个表。

顺便说一句,首先有 FK 的事实告诉我这个问题与 OLTP 环境有关。 OLAP 环境(数据仓库)不需要 FK 或任何其他数据完整性检查,因为仓库数据是静态的。数据源自已进行数据完整性检查的 OLTP 环境。因此,您可以在那里对自己的内心内容进行反规范化。因此,我们不要针对有关 OLTP 环境的问题给出适用于 OLAP 环境的答案。

关于mysql - 当其他表可以使用联接连接时,在单个表中拥有多个外键是好还是坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25146325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com