2010-12-29 4 views
2

私はゴルフクラブ用のMSSQLデータベースを計画/設計しています。 私は、次の表があります。メンバーシップの支払いのためのSQLテーブルデザインのヘルプ

メンバー - 標準の連絡先情報 MembershipTypes - 60のetcを完全に、ジュニア.. PaymentMethods - 現金、口座自動振替、などを確認してください。..

をテーブルのデザインの一つに私は、苦労しているのは支払いです。毎年1月の定期購読量は変更されます。たとえば、2010年にフルメンバーの定期購読は年間1000ポンドです。メンバーAが「フルメンバー」の場合、1回の支払いで10万ポンドを支払うことができます。

この部分は問題ありません。 PaymentID、MemberID、Date、PaymentAmountという支払いテーブルを持つことができます。これにより、メンバーが現在までに支払った金額と未払い金額を教えていただけます。

私の問題は、2011年1月に完全メンバーの定期購入が1100ポンドに増加する可能性があり、計算をしようとすると問題が発生する可能性があります。理論的には、2010年の支払いをアーカイブし、2011年には新鮮な状態にしておく必要があります。メンバーがこれまでに行ったすべての支払いの履歴を表示したいので、これをしたくありません。このシナリオで最も効率的なテーブルデザインの提案を歓迎します。

+2

サンプルスキーマでdatabaseanswers.comを試してみましたか? –

+0

すばらしいサイト!私は今までそれを聞いたことがない。 – James

答えて

4

私はあなたがメンバーレベルで可変契約金額を必要と考えています。例えば、私がサインアップしてデザインを手伝ってくれた場合、あなたが私に請求する金額は会員レベルで購読日に置いておく必要があります。 。サブスクリプションが切れようとしている(スライディングまたはスタティックのいずれか)と、新しいレートになるベースレートが課金されるはずです。私が申し込んだとき、現在までに支払っていた金額、負担する金額(按分した金額かスライド金額)を知っているので、この時点では数学は非常に簡単です。非常に近い

Member 
    MemberId 
    Name 
    Address 
    Etc... 

Product 
    ProductId 
    Name 
    Description 
    Price 

Payment 
    PaymentId 
    SubscriptionId 
    Amount 
    DatePaid 

Subscription 
    SubscriptionId 
    MemberId 
    ProductId 
    Price 
    StartDate 
    EndDate (if needed) 

テストされていないクエリが、::

*-- how much do I owe?* 
select m.Name, sum(s.Price) - sum(p.Amount) as Owes 
from Member m 
join Subscription s on m.MemberId = s.MemberId 
join Payment p on s.SubscriptionId = p.SubscriptionId 
where m.MemberId = 1 

*-- how long have I been a member* 
select datediff('year', min(StartDate), getdate()) as yrs, 
    datediff('month', min(StartDate), getdate()) as mths, 
    datediff('day', min(StartDate), getdate()) as dys 
from Subscription 
where MemberId = 1 

*-- when does my subscription expire* 
select max(EndDate) as ExpirationDate 
from Subscription 
where MemberId = 1 

*-- list all payments by product* 
select m.Name as MemberName, 
    pr.Name as ProductName, 
    pr.Price as ProductPrice, 
    s.Price as SubscriptionPrice, 
    p.Amount as AmountPaid 
    p.PaidDate, 
from Member m 
join Subscription s on m.MemberId = s.MemberId 
join Payment p on s.SubscriptionId = p.SubscriptionId 
join Product pr on s.ProductId = pr.ProductId 
where MemberId = 1 
+0

こんにちはクリス、これは私が必要とするように見えます。私が持っている質問は、たとえばWebページにデータを表示するときに、さまざまなテーブルの情報をすべて表示したいのですが、MemberId 1の現在の年間購読料を表示するSQLクエリは何ですか?私は自分が作成したシステムを管理している人に、1年に1回、サブスクリプション料金を編集するだけです(残念なことに可変の日付)。私の介入は必要ありません。 – James

0

私はあなたが入会費、年間会費と呼ばれるテーブルを作成する必要があると考えています。ここ

は、基本的な例です。各会員の会員が年間に支払う必要がある料金を規定した一意のIDで記録されています。これにより、会員が特定の「商品」を参照して支払いを行うことが可能になります。

+0

あなたは正しい道にいると思います。 – James

+0

@Jamesあなたにアイデアが必要な場合はお知らせください – Bnjmn

関連する問題