-1

約10種類のリクエストを持つリクエストシステムを作成する必要があります。これらの要求はすべて、アプリケーションの「会計」の側面に属します。したがって、私たちはそれらを「会計要求」と呼びました。Railsデータベースの設定多態性

すべてのリクエストは多分わずかな列を共有し、それぞれは最大20個の列を個別に持ちます。

すべてのリクエストタイプを1つのテーブルにフェッチして並べ替えるなど、非常に複雑な結合やクエリを実行しなければならない場合、それ。

単一列継承を使用する方が簡単です。型列があり、1つの表を使用して10のすべての会計要求タイプを格納するためです。

この多くのポリモーフィックな関連付けと要件にSTIを使用することについてどう思いますか?

基本的に、それはそうのようなモデルがあります:

AccountingRequest 
BillingRequest < AccountingRequest 
CheckRequest < AccountingRequest 
CancellationRequest < AccountingRequest 

各サブクラスは、おおよそ10+のフィールドがあります。

現在、複数のテーブル継承 hereについて読ん

。この場合、私の要件に合った解決策のようです。まだよく分からない。

+0

ダウンを説明してください票差の偉大な例です。このような叱責の背後にある推論を知らずに、それを見るのは面倒です。 –

答えて

1

STIをロックし、あなたのモデルはすべて同じ属性を共有している場合は良いフィット感です。

ただし、サブクラスに固有の属性があり、他のサブクラスには適用できない場合は、STIによって多くのNULL列が発生する可能性があります。その場合、私は通常、多形性の関連付けをすることを好みます。

このrailscastエピソードではなく、単に投票ダウンより2

1

聞こえます。

これを調べたところ、値オブジェクトを広範囲に使用することで、一部の属性の一部のタイプの適用不能性を制御することができたことがわかりました。

私の場合、製品の種類がありましたが、その中には特定の測定値がないものもありました。そのような場合、Nullオブジェクトを使用して、該当する場合は「該当なし」を示します。

編集:私はまたcomposed_ofの構文は非常に便利が見つかりました:https://apidock.com/rails/ActiveRecord/Aggregations/ClassMethods/composed_of

1

あなたはそのような状況でSTIを使用することができます。しかし、STIを作成するには、すべての列が1つのテーブルに入る必要があります。それは良い考えではありません。テーブルはフィールド数が非常に大きくなります。

私はあなたが以下のようにのような二つのテーブルに分けるべきだと思います...

  1. が要求:要求テーブルは、要求のタイプについての情報を保存した多型のテーブルになります。

  2. RequestItem:リクエスト項目テーブルは、20個のフィールドレコードすべてをテーブルに保存し、リクエストテーブルの外部キーを持ちます。リクエストアイテムテーブルには、キーと値と呼ばれる2つのフィールドがデータベースに格納されます。

+0

キーバリューアプローチを拒否した理由は、効率的なクエリの実行、制約/検証の追加、正しいデータ型の使用が非常に難しいことです。 –

1

今のところ私はそのような場合にNoSQLを使用しています。 Postgresql's JSONBタイプでは、マルチレベルのルビーハッシュを格納できます。また、DBレベルの制約、インデックス、およびクエリ演算子など、豊富な機能も提供します。

一般的な属性は標準的な方法で保存され、子に固有の - jsonbに保存されます。STI、バリュー・オブジェクト・パターン、シリアライゼーション、または各子のスコープを作成するだけです。私は最後のものを好む - 私のモデルは薄いです、制約の大部分はDBレベルであり、すべてのビジネスロジックはサービスクラスにあります。

長所:

  1. が大きなテーブルにalter tableの回避1つの以上の子タイプを追加する必要が
  2. のうち、不要な列を格納し、選択
  3. シリアル化の防止
  4. 効率的な私のクエリを維持JSON APIのボックス

短所:スキーマレスの

  1. ビット
  2. ベンダーが