gpt4 book ai didi

mysql - 存储 "redundant"外键以避免连接

转载 作者:行者123 更新时间:2023-11-29 20:00:35 24 4
gpt4 key购买 nike

我正在为一个 Web 应用程序项目设计一个数据库,我得出的结论是,我可能有一些查询,需要大量连接表才能进行一次检查。

我想知道将外键存储在某处以减少这些查询所需的联接数量有多糟糕?

举个我现在所拥有的例子:服务 => 预订 => 交易 => 钱包 => BonusOffer

我需要检查该服务是否是通过与奖金关联的钱包购买的。将 BonusOffer id 存储为 Transaction 的外键是否明智?

您可能会问为什么需要事务 - 这是因为大多数查询将“经过”事务,而事务将位于中间的某个位置。

最佳答案

连接是关系 DBMS 的工作方式。了解并使用标准化。

I need to check whether the service has been bought with wallet associated with a bonus.

如果每个服务都是如此,那么您的数据库就会受到约束。 (select service from Service_has_transaction join Transaction_has_wallet)(select service from Service_has_transaction join Transaction_has_wallet join Wallet_has_bonus) 的子集。

大多数 SQL DBMS 不允许您以声明方式表达该约束,并且不知道如何优化执行它。然而,我们可以使用一个 SQL 惯用法来以声明方式表达和强制执行它。 (猜测您的表定义:)首先将 bonus 列添加到 Transaction_has_wallet,并将外键从 Transaction_has_wallet(钱包,bonus) 添加到 Wallet_has_bonus。然后将钱包和奖金列添加到 Service_has_transaction,并将外键从 Service_has_transaction(交易、钱包、奖金) 添加到 Transaction。这会添加冗余列,但仍然将数据库限制为有效状态,因为外键约束可防止冗余值出错。 (希望这是一个学习如何通过触发器表达任意约束的激励示例。)

关于mysql - 存储 "redundant"外键以避免连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40553231/

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