1

我们正在开发一个处理向人们付款的数据库。我目前关注的领域是预定的付款方式。基本上,该系统每两周向人们发送一次付款。因此,每 14 天,在特定的一天(目前是星期三),系统必须处理付款并将其发送出去。

所以,举个例子。PersonA 每天获得 10 美元。每两周,系统会累积一个人的所有付款,将其汇总,然后发出付款。

因此,在第一次付款后,此人会收到 140 美元寄给他们。

但是比较复杂的是,如果支付日是公共假期,或者是停工期,比如圣诞假期(12月24日至1月2日),系统必须在支付日的前一天支付。公共假期或关闭期间,并处理该期间的任何未来付款。

例子:

付款期限为 6 月 1 日至 6 月 14 日。此期间的付款将在 14 日发送,并且是该期间所有付款的累积...因此,在 14 日,我们进行付款运行,收集该期间内的所有付款,并将其发送出去。但是,从 10 日到 18 日有一个公司停业期。所以,在 9 日,系统必须获得从 1 日到 14 日的所有付款(这些付款的构建已处理),并在 9 日创建付款。下一个时段(15 日至 29 日)将正常工作。

问题是:处理这个付款时间表。有人建议我们创建一个包含所有期间的日程表。所以,记录一:开始日期 = 6 月 1 日,结束日期,6 月 14 日。记录二的开始是 15 日,结束是 29 日……以此类推。未来还能走多远?不知道。但是……这对我来说似乎很奇怪。我认为我们只需要一个时间表行,其中“生效日期”为 6 月 1 日,“持续时间”为“两周”或其他内容。然后,使用 .Net 或 SQL,我们可以确定我们是否处于“触发”日期。因此,第一个触发日期将是生效日期加上 14 天。如果他们随后决定将其从星期三更改为星期一(例如),请添加一个新的计划行,其中包含计划生效的星期一日期,以及当系统日期到达该日期时,新的计划变为活动状态。必须有一些逻辑来处理这个问题,但计划日期中一行的基本概念是我的想法。举行所有未来两周的约会似乎 - 奇怪。

处理关闭期将通过“例外日期”类型表处理,该表仅包含公共假期和关闭期,基本上是无法处理付款的日期。

因此,每天晚上,都会运行一个进程。并获取活动时间表行,并确定我们是否在与该生效日期匹配的两周日期(如何?),并检查例外表以确定我们是否需要触发提前付款。

我们如何计算我们是否在基于生效日期的付款日期,然后检查“期间”可能会很棘手......但是,肯定存储所有未来的两周是 - 错误的?

这是我想做的基本开始......但是......不确定它是否可以满足要求:

此表包含计划的行。每次发生更改时,都会添加一个新行。

CREATE TABLE [dbo].[PaymentSchedule] (
    [PaymentScheduleId] INT  IDENTITY (1, 1) NOT NULL,
    [EffectiveDate]     DATE NOT NULL,
    [EffectiveDays]     INT  NOT NULL,
    CONSTRAINT [pk_PaymentSchedule] PRIMARY KEY CLUSTERED ([PaymentScheduleId] ASC)
);

此表包含例外日期。因此,一天将具有相同的开始日期和结束日期......一个范围将具有不同的开始日期和结束日期。

CREATE TABLE [dbo].[ExceptionDate]
(
    [ExceptionDateId] INT NOT NULL IDENTITY, 
    [StartDate] DATE NOT NULL, 
    [EndDate] DATE NOT NULL, 
    [Description] VARCHAR(50) NOT NULL, 
    CONSTRAINT [PK_ExceptionDate] PRIMARY KEY ([ExceptionDateId]) 
)

这可以保存与使用的时间表相关的付款历史记录。

CREATE TABLE [dbo].[PaymentScheduleHistory] (
    [PaymentScheduleHistoryId] INT IDENTITY (1, 1) NOT NULL,
    [PaymentScheduleId]        INT NOT NULL,
    CONSTRAINT [pk_PaymentScheduleHistory] PRIMARY KEY CLUSTERED ([PaymentScheduleHistoryId] ASC),
    CONSTRAINT [fk_PaymentScheduleHistory_PaymentSchedule] FOREIGN KEY ([PaymentScheduleId]) REFERENCES [dbo].[PaymentSchedule] ([PaymentScheduleId])
);

所以,基于这些早期的桌子设计......我不知道如何让它工作。我需要根据时间表以某种方式确定今天的日期是否是触发日期。一旦它工作,我可以添加功能来管理异常日期。这似乎是在正确的轨道上吗?

4

1 回答 1

0

您现有的设计对我来说看起来不错。

我会考虑使用时间表周期表的唯一原因,每个周期都有单独的记录,如果每个周期的长度实际上是任意的。鉴于时间表周期遵循一组相当简单的规则,我不会打扰。

设置这样一个表的另一个原因可能是为了其他程序员的易用性,他们不想在每次编写查询时都重新编码计划周期日期的规则。解决此问题的一种方法是编写一个模拟此类表的视图。

于 2013-06-08T09:27:32.543 回答