Events
いくつかの共通のフィールド(、、)を持つdate
モデルのグループ(それらを呼びましょう)があるRailsアプリがありますがtitle
、user_id
いくつかの「サブタイプ」が必要です。AにSalesEvent
はとがありarticle_id
ますamount
。にはフィールドがあるInterviewEvent
かもしれません。comments
等々。
満たす必要のある3つのビジネス要件を知っています。
Events
場合によっては、全体をフレームに収めたいと思うでしょう(つまり、「Events
このユーザーのすべてを取得し、月単位でグループ化して時系列に並べ替える」)- それ以外の場合は、「サブタイプ」(「このユーザーが販売するすべての記事を取得する」)のみが必要になります。
- サブタイプの数は適度に多くなる可能性があります(まだ未定ですが、ユーザーのフィードバックに応じて約20と推定されます)
このモデルをサポートするためにテーブルを構造化する方法について考えています。これをモデル化するための5つの可能な方法を考え出しましたが、それぞれに独自の欠点があります。
- オプションA:テーブルを分離する-
sales_events
とinterview_events
。これにより、2)非常に単純になり、3)実行可能になりますが、1)実装が非常に面倒になります。 - オプションB:単一テーブル継承。これは1)と2)を多かれ少なかれ簡単に解決しますが、より多くのnull許容フィールドを必要とするという問題があり、3)ではうまく機能しません。
- オプションC:使用
hstore
-本番環境でPostgresを使用しているため、hstoreを使用できます-「タイプ」文字列フィールドによって管理される「データ」フィールドがあります。これは1)、2)、3)を解決しますが、postgresqlに結び付けられ、あまり馴染みのないテクノロジーに主要なビジネスオブジェクトを実装します。できればそれは避けたいです。 - オプションD:への多態的なリンクを持つイベントテーブル
***_event_data
。基本的に、タイプとevent_data_idを持つイベントテーブルがあり、次にsale_event_data
、interview_event_data
などがあります。これは1)と3)を十分に満たしますが、2)結合が多いため、他のアプローチよりも少し弱いです。イベントとそのデータのリンクに関与します。 - オプションE:販売
has_one
:イベント。これは、「他へのリンク」が「データ」部分にあることを除いて、オプションDと同じです。また、1)と3)を解決し、2)のいくつかの結合も含みますが、もう少し「クリーン」に見えます。ここにはポリモーフィックな関連付けはなく、「通常の」SQLの関連付けだけです。
今、私はオプションEを使用する傾向があります。しかし、誰かがそれについて明らかな不利な点、または他のオプションの1つでより大きな利益、または私が考えていなかったより良いオプションを見ているかどうか知りたいです。