使用继承来解决设计问题

时间:2011-05-11 20:38:22

标签: database database-design data-modeling

我需要一个能够在项目出现时存储项目和轨道的表格。

  1. 排队
  2. 标记为发货
  3. 标记为退货
  4. 返回
  5. 该表还需要告诉我一个客户有多少项......

    1. 已在一个月内收到
    2. 此时在家
    3. 我尝试使用继承。我为每个步骤分配了一个typeId(从1到5,每个id代表工作流程中的当前步骤)。这种方法并不理想,因为更新工作流程步骤会删除历史记录。

      例如,如果某个项目从shipped(typeId 3)移动到returned(typeId 5),我们就会丢失已发货项目的准确计数。

      我该如何处理?此外,我更喜欢将数据保存在一个表中,除非我有令人信服的理由不这样做。

      更新

      物品会逐步邮寄给客户。客户在一个月内可以收到的物品数量有限制,并限制客户在任何给定时间可以在家中拥有多少物品。对于这个例子,我们假设先前为4,后者为2。客户队列可以包含任意数量的项目。因此,需要对队列中的项目进行排名,以便根据客户的偏好发送项目的顺序。

      已经发货的商品需要超出排名(客户在发送商品后无法再修改排名)。

2 个答案:

答案 0 :(得分:3)

这里没有继承权。时间字段实际上是日期时间。当客户将项目添加到队列时,会在Tracking表中输入一行。从TimeMarkedShipTimeReturned的其他时间列为NULL,直到操作发生。 TimeQueued是主键的一部分,以便允许客户多次租用商品(听起来像是视频租赁给我)。

enter image description here

要计算客户在家中的商品,您可以使用类似

的商品
select count(1)
from Tracking
where CustomerID = 1755
  and TimeShipped  is not NULL
  and TimeReturned is NULL ; 

答案 1 :(得分:1)

而不是当前步骤的typeID,看起来每个步骤都需要一个布尔列。然后,当您想要计算“净发货”项目时,您可以从“已发货”项目中减去“已退回”项目。

此外,如果您想跟踪历史记录,您可以将这些步骤中的每一个都视为可以为空的日期字段,以便您可以看到某个项目已于2011年3月5日发货并在4/1/11返回。如果您以其他方式使用此表格,例如管理运送/接收或结算,这可能会有所帮助。当然,NULL表示该步骤尚未执行(尚未)。