我有开发系统的需求。该系统的一部分是,每天都会计算一个人的付款(根据某些规则,一个人每天得到 $x.xx),并存储在一个交易表中,该表目前包括personId、金额和日期。
CREATE TABLE DailyTransaction
(
DailyTransaction INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
PersonId INT NOT NULL,
TransactionDate DATE NOT NULL
)
现在系统中有 8,000 人,因此每天有 8,000 行通过进程写入表中。
我认为,存储日期重复太多了。稍后可能会在该日期进行查询。所以,我想创建一个“DailyRun”表,其中包含一个日期和 ID(如果需要,稍后还有更多列)。因此,当我执行每日付款插入运行以填充 8,000 行时,我首先使用日期创建 DailyRun 记录,然后将该行的 ID 分配给 Transaction 表。
CREATE TABLE DailyRun
(
DailyRunId INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
RunDate DATE NOT NULL
)
CREATE TABLE DailyTransaction
(
DailyTransaction INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
PersonId INT NOT NULL,
DailyRunId INT NOT NULL
)
因此,如果我想要特定日期的所有行,我会在 DailyRun 表中找到日期,然后通过外键将与其关联的所有记录获取到事务表。
到目前为止,这似乎还可以(除非有人看到问题?)
但是,现在的问题。
另一个要求是,在白天,可以将临时付款添加到交易表中。所以,额外的一次性付款。但是,它不会被创建为运行。因此,DailyRun 表中没有行。一个想法是 Transaction 表中可以为空的 DailyRun ID,但是......当我需要获取特定日期的所有交易时 - 嗯,没有日期字段......现在 RunID 设置......所以它不会成立。
我能做的是允许 Null RunID,并且还有一个可为空的“AdHocPaymentDate”字段。因此,如果它是 Adhoc 付款,我可以将 RunID 保留为空,并填充 AdHocPaymentDate?
如果它是计划付款运行,我填充 RunID,并将 AdHocPaymentDate 保留为空?
但是,可空字段是不是很慢,或者由于某种原因不推荐?
有没有更好的方法来处理这个?除了保存常规每日付款的表之外,也许还有一个单独的“临时付款”表,它保存临时付款?