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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何设计保留历史而不重复的数据库模式?相关的知识,希望对你有一定的参考价值。

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

所需的功能:

  1. 用户可以查看他们过去声称的所有折扣。
  2. 使用可以查看所有可用的折扣,正确找出您有资格获得每个业务的折扣号码(1 | 2 | 3)。
  3. Biz可以查看他们提供的所有交易
  4. 即使业务改变折扣,索赔的折扣也不会改变。用户历史也不会改变。
  5. Biz应该能够获得所有已声明和未过期折扣的列表。

我的第一个解决方案是简单创建4个表:

  • 我们
  • 用户
  • 折扣
  • Userdiskont

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

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

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

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

答案

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

以上是关于如何设计保留历史而不重复的数据库模式?的主要内容,如果未能解决你的问题,请参考以下文章

执行命令而不将其保留在历史记录中[关闭]

如何在 .Net Core 中提交表单而不离开当前视图并保留当前模型

c语言设计模式--补充面向对象基础

如何将文件从一个文件夹移动到同一git存储库中的另一个文件夹保留历史记录[重复]

Unity与23种设计模式备忘录模式(Memento)

SQL SERVER怎么去掉重复数据?