Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何设计不重复保存历史的数据库模式?_Sql_Postgresql_Architecture_Database Schema - Fatal编程技术网

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

Sql 如何设计不重复保存历史的数据库模式?,sql,postgresql,architecture,database-schema,Sql,Postgresql,Architecture,Database Schema,概述:商务优惠折扣。用户可以使用折扣。商务部提供多种折扣,但只能连续提供。意思是,最初如果你没有使用任何折扣的某个企业。。。您只享受折扣1。一旦你使用折扣1,你有资格获得2,然后一旦你使用2,你有资格获得3 需要的功能: 用户可以查看他们过去申请的所有折扣 使用可以查看他们的所有可用折扣,正确找出您符合每笔业务的折扣编号(1 | 2 | 3) Biz可以查看他们提供的所有交易 即使企业改变了折扣,申请的折扣也不会改变。用户历史记录也不会改变 Biz应该能够获得所有已申请且未过期折扣的列表 我的第

概述:商务优惠折扣。用户可以使用折扣。商务部提供多种折扣,但只能连续提供。意思是,最初如果你没有使用任何折扣的某个企业。。。您只享受折扣1。一旦你使用折扣1,你有资格获得2,然后一旦你使用2,你有资格获得3

需要的功能:

  • 用户可以查看他们过去申请的所有折扣
  • 使用可以查看他们的所有可用折扣,正确找出您符合每笔业务的折扣编号(1 | 2 | 3)
  • Biz可以查看他们提供的所有交易
  • 即使企业改变了折扣,申请的折扣也不会改变。用户历史记录也不会改变
  • Biz应该能够获得所有已申请且未过期折扣的列表
  • 我的第一个解决方案是简单地创建4个表:

    • 生意
    • 使用者
    • 折扣
    • 用户折扣
    Biz创建折扣,用户获得折扣,并将其保存在用户折扣中。 商务与折扣有一对多的关系。折扣与用户折扣有一对多的关系

    问题是,若biz更新或删除了他们的折扣,那个么它将完全改变用户的历史记录,并在折扣尚未过期的情况下赎回折扣

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


    第三是每次业务更新或删除其折扣时只需在折扣中创建新记录。但是现在我必须为每个折扣添加一个标志,如果这是活动的,在有3条记录之前,现在可能有100条,取决于业务部门更新其资料的次数。

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

    在数据仓库中,这是通过SCD2实现的。同一项目的每个配置都有开始和结束日期。如果有多个配置,则当前配置有一个标志指示该配置。如果需要存储多个状态,则无法存储多个记录。你的第三个选择对我来说最有意义。记录会膨胀,但这就是数据库的用途