2016-05-13 17 views
0

ユースケース(ウィックスのサブスクリプションモデルに類似)データベース設計

は、ユーザーが多くのウェブサイトを持つことができます。 1つのウェブサイトを持つためには、彼はサブスクリプションを購入し、維持する必要があります。

ウェブサイトがもっと必要な場合は、彼が作成したウェブサイトごとに個別の購読を購入し、維持する必要があります。

私はRails用のデータベースを設計しています。デザインの仕方はかなり混乱しています。

どちらが優れていますか?

Client 
has_many :websites 
has_many :subscriptions, through: :websites 

Website 
belongs_to :client 
belongs_to :subscription 

Subscription 
has_many :websites 
belongs_to :client 
has_many :pricing_plans 

PricingPlan 
belongs_to :subscription 

または

Client 
has_many :websites 
has_many :subscriptions, through: :websites 

Website 
belongs_to :client 
has_one :subscription 

Subscription 
belongs_to :website 
belongs_to :client 
has_many :pricing_plans 

PricingPlan 
belongs_to :subscription 

またはより良いデザインがありますか?私は何の注意を払うべきですか?ユーザーがサブスクリプションをキャンセルした場合は、Webサイトも自動的に無効にする必要があります。私の意見で

答えて

2

、私はこのようなものとなるだろう:

Client 
has_many :subscriptions 
has_many :websites, through: :subscriptions 

Subscription 
belongs_to :client 
has_one :website 
has_one :pricing_plan_subscription 
has_one :pricing_plan, through: :pricing_plan_subscription 

Website 
belongs_to :subscription 
has_one :client, through: :subscription 

PricingPlan 

PricingPlanSubscription 
belongs_to: :subscription 
has_one: :pricing_plan 

クライアントは、これらのサブスクリプションを通じて多くのサブスクリプションと多くのウェブサイトを持っているでしょう。クライアントはサブスクリプションなしでWebサイトを持つことができないので、最初の例のようにこれを元に戻す必要はありません。

また、この解決策の別の主な違いは、PricingPlanPricingPlanSubscriptionとの間にちょうどPricingPlanがあることです。これは、料金プランを標準化し、異なるユーザーに再利用できるようにするためです。したがって、「コンテナ」PricingPlanSubscriptionを使用すると、必要に応じて料金設定プランをユーザーと関連付けることができます。

「無効化」を処理するには、サブスクリプションまたはウェブサイトを破棄しないで、簡単にアーカイブに追加する列を追加します。そうすれば、必要に応じて将来的に復元することができます。もちろん、このアクションを処理するメソッドを記述する必要があります。

+0

こんにちはブライアン、非常に助けてくれてありがとう。しかし、PricingPlanとPricingPlanSubscriptionの違いはあまりありません。それぞれのモデルのいくつかのサンプル属性を提供して、それらの違いを説明できることを願っています。 – RailsNewbie

+0

@RailsNewbie PricingPlanには、名前、コスト、用語などのフィールドが含まれます.PricingPlanSubscriptionはPricingPlanとSubscriptionの両方をリンクするためにのみ存在し、したがってpricing_plan_idとsubscription_idのみを含みます。将来、データベースを更新したい場合は、個々の価格プランをすべて見つけ、それに応じてすべてのコストを更新する必要があるため、価格プランのコストを保管するためにデータベースに多数のレコードを保存することは望ましくありません。リンクされた構造を持つと、1つのエントリを更新し、関連するすべてのレコードが更新を反映します。もう少し意味がある? –

+0

ストライプを統合したい場合、料金プランが必要でしょうか? – RailsNewbie