【问题标题】:SQL Table Design Help for Payments of Membership Subscriptions会员订阅付款的 SQL 表设计帮助
【发布时间】:2010-12-29 00:19:00
【问题描述】:

我正在为高尔夫球杆规划/设计一个 MSSQL 数据库。 我有以下表格:

成员 - 标准联系信息 会员类型 - 完整、初级、60 岁以上等。 PaymentMethods – 现金、常规订单、支票等。

我正在努力解决的一种表格设计是付款。每年 1 月,订阅金额都会发生变化,例如,在 2010 年,一年的正式会员订阅为 1000 英镑,因此如果会员 A 是“正式会员”,他可以在 10 个月内一次性或分期支付 1000 英镑的预付款。

这部分没有问题。我可以有一个包含 PaymentID、MemberID、Date、PaymentAmount 的付款表,这可以告诉我会员迄今为止支付了多少以及未支付的金额。

对我来说,问题是在 2011 年 1 月,正式会员订阅可能会增加到 1100 英镑,这会在尝试进行计算时产生问题。理论上,我需要存档 2010 年的付款并重新开始 2011 年 - 我不想这样做,因为我想展示会员曾经进行过的每一笔付款的历史。我欢迎任何关于这种情况下最有效的表格设计的建议。

【问题讨论】:

  • 您是否尝试过 databaseanswers.com 作为示例架构?
  • 很棒的网站!直到现在我才听说过。

标签: sql database-design


【解决方案1】:

我认为您需要会员级别的可变订阅金额。例如,如果我注册并且您给我折扣以帮助您进行设计,那么您向我收取的金额应与订阅日期一起位于会员级别,以便您知道每月或一次收取多少.当我的订阅即将到期(滑动或静态)时,我应该被收取基本费率,这将是新费率。在这一点上,数学很简单,因为您知道我什么时候注册,到目前为止我支付了多少以及我欠了多少(按比例分配或滑动)。

这是一个基本示例:

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

【讨论】:

  • 嗨,克里斯,这看起来像我需要的。我的一个查询是,例如,当在网页上显示数据时,我想显示来自各种表的所有信息,显示 MemberId 1 的当前年份订阅费的 SQL 查询是什么?我希望管理我创建的系统的人每年只编辑一次订阅费用(不幸的是可变日期),而不需要我的任何干预。
【解决方案2】:

我认为您需要创建一个名为会员费用的表,其中每年的会员费记录有一个唯一的 ID,该 ID 规定了每种类型的会员每年必须支付的费用。这应该使您能够允许成员根据特定“产品”进行付款。

【讨论】:

  • @James 如果您需要更多想法,请告诉我
猜你喜欢
  • 2016-06-29
  • 2011-12-19
  • 2016-07-07
  • 2011-04-21
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
相关资源
最近更新 更多