0

私はWebアプリケーションプロジェクトのデータベースを設計しています。結論が出ました。結合を避けるために「冗長」な外部キーを保存する

これらのクエリに必要な結合数を減らすために、外来キーをどこかに格納するのはどれくらいの難しさがありますか?この時点で、あなたに私が持っているものの例を与えることを

: サービス=>予約=>トランザクションを=>財布=> BonusOffer

私はサービスが関連付けられた財布を購入されたかどうかを確認する必要がありますボーナス。 BonusOffer idをTransactionの外部キーとして保存するのが賢明でしょうか?

なぜこれらのクエリのほとんどがトランザクションとトランザクションを通過するのかを問うことができます。トランザクションとトランザクションは途中にあります。

+0

私の心はあなたがすべきではないと言いますが、私の心はあなたが望むなら試すことができると言います。 'EXPLAIN PLAN'を常にチェックして、改善があるかどうかを確認してください。あなたは何かを最適化しようと多くの時間を費やすことがあるので、dbはすでに最適化するように設計されていますので、「あまりにも多くの」心配する必要はありません。 –

+0

@JuanCarlosOropezaもそうです!私は、 'BonusOffer'と' Transaction'の間のリンクにヘルパーテーブルを使うことを考えました。このようにして、私は冗長性を避け、クエリが満足されるでしょう。それがより良い方法だと思いますか?実際には、これらのクエリは高速であるとは確信していますが、実際にパフォーマンスの問題が発生したらすぐにパフォーマンスを向上させるよりも、データベースを最適化する必要がある前に詳細を知りたいと思います。 – user1970395

+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までの外部キーを追加します。これにより、冗長列が追加されますが、外部キー制約によって冗長な値が誤ってしまうことが防止されるため、データベースが有効な状態に制限されます。 (うまくいけば、これはトリガーを使って任意の制約を表現することを学ぶモチベーションの例です)。

関連する問題