belongs_toを2倍の速度で動作するようにアップグレードする方法(database_validations gem)

この記事では、通常のbelongs_toではなく、 database_validations db_belongs_toを使用する必要がある理由を示します。


私はあなたのほとんどがORM ActiveRecordの belongs_to精通しているとbelongs_toしています。 しかし、モデルでbelongs_toを使用して接続を初期化すると、接続の存在に検証が追加されることをbelongs_to これは、 belongs_toはデフォルトでoptional: falseオプションがあるためです。


したがって、新しいオブジェクトを保存するか、既存のオブジェクトを更新するたびに、各リンクに対して追加のSQL SELECTクエリを実行します。



 class User < ActiveRecord::Base belongs_to :company belongs_to :country end user = User.first user.update(some_field: 'something') #        SELECT,  ,   `company`  `country`  

また、このアプローチはデータベースの整合性を保証するものではないことにも注意してください。 リンクは後で問題なく(後続の要求または並列要求で)削除できます。


 user.update(...) user.company.destroy! =>     ,  ,          ,       (     ) 

この問題を解決するには、対応する外部キー制約をデータベースに追加します。 この制限があるため、この接続が存在することを常に確認できます。


パフォーマンスはどうですか? データの整合性が(外部キー制約を使用して)維持されることが確実である場合に、データベースに対してSELECTクエリを作成する必要があるのはなぜですか?


答えは簡単です-必要はありません。 ただし、これを可能にするには、データベースにない接続を保存しようとしたときに発生するActiveRecord::InvalidForeignKey例外の処理の問題を解決する必要があります。 これは、 errorsに同じエラーerrors含まれるように、 belongs_toと同じ動作をさせるために必要です。


すべての処理を自分で記述しないようにするには、 database_validations gemが役立ちます。 このgemにはすでに人々が気に入っている( ハブに投稿するvalidates_db_uniqueness_ofが含まれており、プロジェクトに非常に簡単に実装できるdb_belongs_toがあります。 db_belongs_toはパフォーマンスを向上させ、データの整合性を確保します。


メソッドはいくつかのことを行います:



プロジェクトでdatabase_validationsを使用することをお勧めします。 このgemはすでに実稼働環境でテストされており、非常に優れていることが証明されています。 実装は簡単ですが、次のようにプロジェクトのパフォーマンスを大幅に改善できます。 使用すればするほど、保存量が増えます 。詳細については、 グループベンチマークをご覧ください。


フィードバックは大歓迎です! プロジェクトへの貢献に感謝します!



Source: https://habr.com/ru/post/J431734/


All Articles