【问题标题】:How to design db schema that preserves history without repetition?如何设计保留历史而不重复的数据库模式?
【发布时间】:2018-03-03 01:40:09
【问题描述】:

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

所需功能:

  1. 用户可以查看他们过去申请的所有折扣。
  2. 用户可以查看他们的所有可用折扣,正确找出您符合每个企业的折扣编号 (1|2|3)。
  3. Biz 可以查看他们提供的所有交易
  4. 即使商家更改折扣,声称的折扣也不会改变。用户历史记录也不会改变。
  5. Biz 应该能够获得所有已申请且未过期的折扣的列表。

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

  • 商务
  • 用户
  • 折扣
  • 用户折扣

Biz 创建折扣,用户获取折扣,然后保存在 UserDiscount 中。 Biz 与 Discount 有一对多的关系。折扣与 UserDiscount 是一对多。

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

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

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

【问题讨论】:

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

标签: sql postgresql architecture database-schema


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 2013-10-19
    相关资源
    最近更新 更多