更新记录还是保留日志?

时间:2011-12-23 16:19:59

标签: database database-design

我正在处理用户订阅。

用户创建定期订阅。该订阅可能会发生许多事情,例如更新,或者已取消,或者最新的结算失败,或者用户已暂停或重新启动订阅。

你建议:

  1. 每个用户都有一条subscriptions条记录,其中包含所有可能值的字段,例如开始日期,到期日期,是否有效,结算日期失败,已取消日期,暂停日期,重新开始日期?
  2. 或者有一个subscriptions记录,带有辅助表subscription_events?此辅助表中的一行可以记录“订阅X已更新”。然后我会查询最新的订阅事件,以确定其当前状态。
  3. 还是更好的方法?

2 个答案:

答案 0 :(得分:1)

不要去1.它对新事件不够灵活。您不希望每次出现新事件时都需要更改表格的设计。你还需要每个事件日期的列,当你想知道事物的顺序时,它就会变得丑陋。 当用户可以拥有多个订阅时会发生什么?

2是对的。为了规范化它,我想你有一个USER表和一个带有SUBSCRIPTION的SERVICE表将两者映射在一起。然后会有一个包含已知可能事件的EVENT表和一个带有时间戳的SUBSCRIPTION_EVENT_MAP映射到EVENT的订阅。

答案 1 :(得分:0)

归结为intention的{​​{1}}。以下是许多方法中的一些方法:

您可以使用历史记录表:

design

或者与查找结合使用的历史记录表:

-- stores info re:reason for the last update of a subscription
CREATE TABLE subscription_history (
      subscription_id INT
    , change_date DATETIME
    , change_reason VARCHAR(255)
)

或审计表v1:

-- stores info re:reason for the last update of a subscription
--     but links to a change_reason table for reason id lookups
CREATE TABLE subscription_history_L (
      subscription_id INT
    , change_date DATETIME
    , change_reason_id INT
)

-- lookup table containing change reasons
CREATE TABLE change_reason (
      change_reason_id INT
    , change_reason VARCHAR(255)
)

或审计表v2:

-- contains all columns in your subscription table plus audit fields
CREATE TABLE subscription_audit (
      subscription_audit_id INT
    -- All the fields from your `subscriptions` table
    , audit_date DATETIME
    , audit_reason VARCHAR(255)
    , audit_by VARCHAR(255) -- example
    -- etc etc whatever other information that is pertinent to the change
)

我不知道你的RDBMS,但这几乎是一般的SQl(我认为我可以更好地用作解释方法而不是单词和单词)