我正在为一个Web应用程序项目设计一个数据库,我得出的结论是,我可能只有很少的查询需要很多连接表才能进行一次检查。
我想知道在减少这些查询所需的连接数量的路上存储外键有多糟糕?
为了举例说明我现在的情况: 服务=>预订=>交易=>钱包=> BonusOffer
我需要检查是否已使用与奖金相关联的钱包购买该服务。将BonusOffer id存储为Transaction的外键是否明智?
你可以问为什么交易 - 它是因为大多数这些查询将会经历"交易和交易将位于中间位置。
答案 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
的外键。这会添加冗余列,但仍将数据库限制为有效状态,因为外键约束可防止冗余值出错。 (希望这是学习通过触发器表达任意约束的动机例子。)