存储"冗余"外键以避免连接

时间:2016-11-11 17:29:00

标签: mysql database-design foreign-keys foreign-key-relationship database-normalization

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

我想知道在减少这些查询所需的连接数量的路上存储外键有多糟糕?

为了举例说明我现在的情况: 服务=>预订=>交易=>钱包=> BonusOffer

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

你可以问为什么交易 - 它是因为大多数这些查询将会经历"交易和交易将位于中间位置。

1 个答案:

答案 0 :(得分:0)

联接是关系DBMS的工作方式。了解并使用规范化。

  

我需要检查是否已使用与奖金相关联的钱包购买该服务。

如果每个服务都适用,那么您的数据库将受到约束。 (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 (wallet, bonus)添加到Wallet_has_bonus。然后添加钱包& Service_has_transaction的奖励列和Service_has_transaction (transaction, wallet, bonus)Transaction的外键。这会添加冗余列,但仍将数据库限制为有效状态,因为外键约束可防止冗余值出错。 (希望这是学习通过触发器表达任意约束的动机例子。)