2010-12-29 5 views
2

Ich plane/entwerfe eine MSSQL-Datenbank für einen Golfclub. Ich habe die folgenden Tabellen:SQL Table Design Hilfe für Zahlungen von Mitgliedschafts-Abonnements

Mitglieder - Standard Kontaktinformationen MembershipTypes - Full, Junior, über 60er etc .. Paymentmethods - Bargeld, Standing Order, Scheck etc ..

Einer der Tabelle entwirft I Ich kämpfe mit Zahlungen. In jedem Januar ändert sich der Abonnementbetrag, zum Beispiel im Jahr 2010 ist das Abonnement für Vollmitglieder £ 1000 für das Jahr. Wenn Mitglied A ein "Vollmitglied" ist, kann er die 1000 € im Voraus in einer Zahlung oder Ratenzahlungen über 10 Monate bezahlen.

Dieser Teil ist kein Problem. Ich könnte eine Zahlungstabelle mit PaymentID, MemberID, Date, PaymentAmount haben und dies könnte mir sagen, wie viel das Mitglied bis heute bezahlt hat und wie viel ausstehend ist.

Das Problem für mich ist im Januar 2011 das volle Mitglieder-Abonnement könnte auf £ 1100 erhöhen, die ein Problem bei dem Versuch, Berechnungen zu erstellen wäre. Theoretisch müsste ich die Zahlungen für 2010 archivieren und für 2011 neu starten. Ich möchte das nicht tun, da ich eine Geschichte über jede einzelne Zahlung, die das Mitglied jemals gemacht hat, zeigen möchte. Ich begrüße Vorschläge für das effizienteste Tischdesign für dieses Szenario.

+2

haben Sie databaseanswers.com für ein Beispielschema versucht? –

+0

Tolle Seite! Ich habe noch nie davon gehört. – James

Antwort

4

Ich glaube, dass Sie einen variablen Subskriptionsbetrag auf Mitgliedsebene benötigen. Zum Beispiel, wenn ich mich anmelde und Sie mir einen Rabatt geben, um Ihnen beim Design zu helfen, sollte der Betrag, den Sie mir berechnen, auf der Mitgliederebene zusammen mit einem Abonnementdatum liegen, damit Sie wissen, wie viel Sie monatlich oder auf einmal sammeln müssen . Wenn mein Abonnement kurz vor dem Ablauf steht (gleitend oder statisch), sollte mir der Basiszinssatz berechnet werden, der der neue Tarif wäre. Die Mathematik ist zu diesem Zeitpunkt ziemlich einfach, weil Sie wissen, wann ich mich angemeldet habe, wie viel ich bis heute gezahlt habe und wie viel ich schulde (anteilig oder gleitend). Mitgliedschaft Kosten genannt, wo die Mitgliedsbeiträge pro Jahr

*-- 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

Hallo Chris, das sieht aus, als müsste ich was brauchen. Eine Abfrage, die ich habe, ist, wenn ich die Daten auf einer Webseite zum Beispiel präsentiere, möchte ich alle Informationen aus den verschiedenen Tabellen zeigen, was wäre die SQL-Abfrage, um die aktuelle Jahresbeitragsgebühr für Mitglied 1 anzuzeigen? Ich möchte, dass die Person, die das System verwaltet, das ich erstelle, die Abonnementgebühren nur einmal pro Jahr ändert (variables Datum leider) und keine Intervention von mir benötigt wird. – James

0

Ich denke, dass Sie eine Tabelle erstellen müssen:

Hier ist ein einfaches Beispiel:

Member 
    MemberId 
    Name 
    Address 
    Etc... 

Product 
    ProductId 
    Name 
    Description 
    Price 

Payment 
    PaymentId 
    SubscriptionId 
    Amount 
    DatePaid 

Subscription 
    SubscriptionId 
    MemberId 
    ProductId 
    Price 
    StartDate 
    EndDate (if needed) 

Ungeprüfte Anfragen, aber ganz in der Nähe werden mit einer eindeutigen ID erfasst, die die Gebühr angibt, die jede Art von Mitglied pro Jahr zahlen muss. Dies ermöglicht es Ihnen, Mitgliedern zu erlauben, Zahlungen in Bezug auf ein bestimmtes "Produkt" zu leisten.

+0

Ich denke, Sie sind auf dem richtigen Weg. – James

+0

@James lassen Sie mich wissen, wenn Sie weitere Ideen benötigen – Bnjmn