【发布时间】:2013-06-08 03:39:11
【问题描述】:
我们正在开发一个处理向人们付款的数据库。我目前关注的领域是预定的付款方式。基本上,该系统每两周向人们发送一次付款。因此,每 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])
);
所以,基于这些早期的桌子设计...我不知道如何让它发挥作用。我需要根据时间表以某种方式确定今天的日期是否是触发日期。一旦这样做了,我就可以添加功能来管理异常日期。这似乎是在正确的轨道上吗?
【问题讨论】:
-
显示你到目前为止尝试过的内容。
-
我正在玩单行解决方案的概念......但试图构建一个数据库以便我可以测试它。计划单行的想法,具有生效日期和“持续时间”。然后,一种计算“这是付款日期”类型函数的方法。但希望这之前已经做过,并且有人可以向我解释一个模型。
-
抱歉,没有正确回答。我现在正忙着建立一个数据库来尝试我的概念......所以没有太多可以展示的东西。一旦我有一些创建语句,将添加。
-
我认为带有生效日期的单行想法会更有效。假设您将其命名为 SchedulePaymentSetup,其中包含 FirstEffectiveDate、OffsetDays(您的示例中的值如 14)、NextPaymentDate、LastPaymentDate 等字段。但是您将拥有 PaymentDateHistory 只是为了记录付款的日期。当然,对于那些工资单将被关闭并因此提前完成的日期,您将拥有 ExceptionDates。
-
这听起来很符合我的期望......如果我们处于触发日期,如何解决(使用 SQL?)可能会很有趣?
标签: sql sql-server database-design