如何设计保留历史而不重复的数据库模式?

时间:2018-03-03 01:40:09

标签: sql postgresql architecture database-schema

概述:商家优惠折扣。用户可以使用折扣。商家提供多种折扣,但只能连续使用。这意味着,最初如果您没有使用某项业务的任何折扣......您只有资格获得折扣1.一旦您使用折扣1,您就有资格获得2,那么一旦您使用2,您就有资格获得3。

需要的功能:

  1. 用户可以查看过去声明的所有折扣。
  2. 使用可以查看所有可用的折扣,正确找出您有资格获得每项业务的折扣号码(1 | 2 | 3)。
  3. Biz可以查看他们提供的所有优惠
  4. 即使业务更改折扣,索赔的折扣也不会改变。用户历史记录也不会发生变化。
  5. Biz应该能够获得所有已声明和未过期折扣的列表。
  6. 我的第一个解决方案是简单创建4个表:

    • 商务
    • 用户
    • 折扣
    • UserDiscount

    Biz创建折扣,用户获取折扣并将其保存在UserDiscount中。 Biz与Discount有一对多关系。使用UserDiscount折扣有一对多。

    问题是如果商家更新折扣或删除折扣,它会完全改变用户的历史记录,并且即使他们没有过期也可以兑换折扣。

    其次是在UserDiscount中创建整个副本。但这看起来像是很多重复。

    第三是每次业务更新,或删除他们的折扣只需在折扣中创建新记录。但是现在我要为每个折扣添加一个标志,如果这是否是活动的,并且在有3个记录之前,现在可能有100个,这取决于业务更新他们的东西多少次。

1 个答案:

答案 0 :(得分:1)

为了避免更改历史记录和最小化重复的问题,您不应该在折扣表中编辑记录,而是在需要时添加新记录。如果折扣有效,您可以添加标记,但使用生效日期/到期日期更好。您可以进行的一项优化是允许编辑尚未使用的折扣,以最大限度地减少表中未使用的行。