工場とシーダーはどちらもデータベース管理で使用されるツールです。特に、テストまたは初期データをデータベースに生成して入力するためのソフトウェア開発のコンテキストで使用されます。それらは、アプリケーションをテストまたはセットアップするためのデータを作成するプロセスを自動化および合理化するのに役立ちます。ただし、明確な目的とメカニズムにより、モデル間の関係をまったく異なって処理します。
工場は主に、ランダム化または事前に定義された属性を使用して、多くの場合Fakerライブラリを使用して、単一または関連するモデルインスタンスを生成することに焦点を当てています。一方、シーダーは、複数のモデルとその関係を含めることができるデータベースにデータベースを入力するための一連の指示を実行することに関するものです。
###定義と目的
工場は、偽のデータを使用して個別または関連するモデルインスタンスを簡単かつ一貫して作成するように設計されています。開発者は、モデルの青写真を定義し、属性の入力方法を指定し、テストまたはデータベースシードのためにそのモデルの多くのインスタンスの生成を可能にします。工場はしばしば、モデル間の非常に明確な関係で、またはモデルインスタンスの属性と存在に焦点を当てて、モデル間で非常に明確な関係を備えて機能します。
シーダーは、データベースを設定するために工場または直接データベース挿入を呼び出すことができるスクリプトまたはクラスとして機能します。シーダーはより全体的で手続き的であり、データ作成の順序とロジックを制御します。彼らは、特に複数の相互依存テーブルが関与している場合、データの整合性を維持するために、データ母集団が正しいシーケンスで発生することを保証します。
###工場での関係の処理
モデル工場では、関係は通常、工場の定義自体内で関係を定義することによって処理されます。たとえば、ユーザーモデルがプロファイルモデルと1対1の関係を持っている場合、ユーザーファクトリーは、ユーザーを作成するときに関連するプロファイルを生成および関連付ける関連メソッドまたは関連するコールバックを介してプロファイルを「」と定義できます。
工場は、モデル工場がインスタンスを作成するために使用される場合、同じ操作で関連するモデルインスタンスを自動的に作成および関連付けるように、リレーショナルロジックを埋め込むことができます。これは、多くの場合、 `has()`、 `for()`、または関連するモデルを生成するカスタムリレーションシップコールバックなどのメソッドを使用して行われます。関連データがメインモデルデータとともに透過的に作成されるため、このアプローチはテストを容易にします。
###シーダーの関係の処理
シーダーは工場を使用しますが、全体的な流れと創造の順序を整理します。シードには複雑な関係が含まれる可能性があるため、シーダーは通常、子どもモデルの前に親モデルの作成を保証することにより、データベースの制約(例:外部キー)に準拠することにより、関係を管理します。たとえば、ユーザーが組織に属する関係では、シーダーは最初に組織を作成し、次に組織にリンクする適切な外部キーを持つユーザーを作成します。
シーダーは、データの作成を任意の順序で操作または調整し、シンプルまたは複雑なデータセットを組み合わせて、多くの関係のある外部キーまたはピボットテーブルの明示的な処理を行うことができます。彼らはしばしば、工場が責任を負わないオーケストレーションを処理します。たとえば、複数のテーブルでデータの整合性ルールを満たすためにシードのシーケンスを決定するなどです。
###関係の複雑さとパターン
工場は通常、需要のある関連レコードを生成する組み込みの方法を使用して、単純なモデル関係またはネストされたモデル関係を定義します。彼らは、モデルを作成し、その即時関係を1回の呼び出しで作成します。たとえば、ユーザーの工場は、複数の投稿を自動的に作成するための関係を定義したり、ユーザーに属するプロファイルを作成し、モデルインスタンスのネストされたJSONのような構造をシームレスに生成する場合があります。
シーダーは、おそらく多くのモデルにわたってデータに関連するデータが適切な順序でどのように作成されるかを明示的に定義する必要があります。最初にすべての組織を作成し、次にすべてのユーザー(ユーザーを組織と関連付けます)を作成し、次にユーザーにリンクした投稿を作成する場合があります。この順序は、外部のキーの制約を満たすために維持する必要があります。シーダーは、条件付きシード、環境ベースのシード、またはデータの作成などの複雑なシナリオも処理します。
###多くの関係
多くの関係と多くの関係を処理することがより複雑です。工場は、ピボットテーブル工場を使用した関係の作成を許可するか、「Attach()」などの方法を使用して、多くの場合、工場の定義内または工場の作成後に「Attach()」などの方法を介して抽象化します。これにより、関連するモデルを簡単に生成し、それらをピボットデータに自動的にリンクできます。
一方、シーダーは、両方のモデルのインスタンスを最初に作成し、次に雄弁な関係方法またはダイレクトデータベースクエリのいずれかを介してピボットテーブルインサートを呼び出すことにより、多目的リンクを明示的に調整します。シーダーは、IDをリンクし、追加のピボットデータフィールドを追加することにより、ピボットテーブルの母集団を管理し、データベースが正しいモデル間接続を反映するようにします。
###外部キー依存関係
工場は、多くの場合、定義内で外国の主要な依存関係を管理します。工場が別のモデルに依存するモデルを作成すると、関連する工場をネストして親または関連モデルを自動的に生成できます。このアプローチは、存在しないレコードを参照するリスクを軽減し、テスト用の有効なデータセットの作成を合理化します。
シーダーは、外部のキー依存関係を明示的に処理する必要があり、多くの場合、これらの制約を尊重するためにテーブル母集団を慎重に注文する必要があります。シーダーでは、最初に親モデルまたは参照モデルを作成し、次に主要なキーを使用して従属モデルをリンクします。したがって、シーダーは、関係の完全性に関するデータベース母集団の流れを管理するオーケストレーターとして機能します。
###再利用性と構成
工場は非常に再利用可能で構成可能です。それらは一度定義でき、特定の関係を備えたスタンドアロンインスタンスまたは関連インスタンスを繰り返し作成し、テストワークフローまたはバリアントを使用した繰り返しシードデータ生成をサポートするために使用できます。
シーダーは、より手続き的なスクリプトであり、単独で再利用できない傾向があり、多くの場合、特定のデータ母集団シナリオまたは環境のセットアップに焦点を当てています。しかし、彼らは工場をビルディングブロックとして呼び出し、複雑なデータ環境を設定するためにこれらの呼び出しを意味のある順序で作成します。
###トランザクションと分離
工場は、通常、単独で、または単一の工場呼び出しの一部としてインスタンスを作成します。これは、テストのためのトランザクションに包まれている可能性がありますが、通常そうではありません。彼らは、モデルとその関係を一度に生成することに焦点を当てています。
シーダーは、データベーストランザクションで大規模なデータ母集団シーケンスをラップして、シード操作全体が成功または故障し、関連するテーブルの部分または破損したデータを防ぐことを保証します。このトランザクションアプローチは、シーダーが複数の相互依存モデルと関係を管理する場合に不可欠です。
###利点とユースケース
関係に工場を使用することは、テストデータの迅速かつ孤立した生成またはテスト自体の中で必要なシナリオで有利です。手動介入なしに関連するモデルの作成を簡素化し、開発者が手動データセットアップの代わりにテストに集中できるようにします。
シーダーは、環境のセットアップ、初期データ母集団、またはデータベース人口の順序とロジックがマルチモデル依存関係やビジネスロジックコンプライアンスを含む複雑なシードシナリオに優先されます。シーダーは、工場と直接データベース操作を呼び出して、開発またはステージングのために完全に準備されたデータベース状態を提供します。
###実用的な例
ユーザーとその投稿の作成を検討してください。
- 工場を使用すると、ユーザー工場で関係を自動的に作成する関係を定義できます。そのため、ユーザーがファクトリーを介して作成されると、関連する投稿が自動的に作成されます。
- シーダーを使用すると、シーダーは最初にユーザーファクトリーを使用してユーザーを作成します。次に、別々に、ポストファクトリーを使用して投稿を作成し、ループまたはバッチでユーザーと明示的に関連付けて、参照の完全性を確保します。
工場は、モデル作成プロセス自体内の関係ロジックをカプセル化することに焦点を当てています。シーダーは、一貫した全体的なデータベース状態を保証するオーケストレーションと順序に焦点を当てています。
### まとめ
工場は、工場の定義にリレーショナル作成ロジックを埋め込み、関連するモデルの自動でネストされた作成を可能にすることにより、関係を処理します。関連するモデルの単一または小さなセットを生成するときに、シンプルさと再利用性を促進します。これは、テストと迅速な偽データ生成に最適です。
シーダーは、完全なデータベース母集団プロセスの順序とフローを調整することにより、関係を処理し、関連するモデルが一貫した順序で有効な外国のキーを使用して作成されるようにします。彼らは工場をビルディングブロックとして使用しますが、シード操作全体にわたって複雑なモデル間依存関係、環境固有のデータ、およびトランザクションの一貫性を管理する責任を拡大します。
違いは抽象化レベルにあります。工場は個々のモデルとその即時のリレーショナルデータ生成に焦点を当て、シーダーがデータベースのデータ初期化全体を調整し、モデルの依存関係と関係をより広範な範囲で調整します。この区別は、工場が関係を宣言的に定義する理由であり、シーダーは実際のデータベース環境でそれらの関係を確実に埋めるための手続き的論理を実装しています。