2011-12-23 6 views
1

私はユーザーのサブスクリプションを扱っています。レコードを更新するか、ログを保持しますか?

ユーザーが定期購読を作成します。更新されたか、取り消された、最新の請求がうまくいかなかった、またはユーザーが定期購入で一時停止または再開したなど、そのサブスクリプションには多くのことが起こる可能性があります。

あなたがお勧めでください:

  1. を、このような開始日など、すべての可能な値のフィールドを持つユーザーごとに1つのsubscriptionsレコードを、持って、日付を満了し、アクティブである、請求日を失敗し、キャンセルした日付は、日付を一時停止し、再開した日付?
  2. subscriptionsレコードを1つ持ち、セカンダリテーブルsubscription_eventsを使用していますか?この2次表の行は、「サブスクリプションXが更新されました」と記録できます。それから最新のイベントにサブスクリプションを問い合わせて、現在のステータスを把握します。
  3. または、より良いアプローチですか?

答えて

1

が1のために行ってはいけない(私はより良い言葉と言葉よりも説明する方法として使用することができると思う)、一般的なSQLです新しい出来事のために。新しいイベントが発生するたびにテーブルを変更する必要があるデザインは望ましくありません。あなたはまた、各イベントの日付のための列を必要とするだけで、物事の順序を知りたいときは醜いものになり始めます。 また、ユーザーが複数のサブスクリプションを持つことができる場合はどうなりますか?

2はほぼ正しいです。それを少し正規化するために、USERテーブルとSERVICEテーブルをSUBSCRIPTIONと一緒にマッピングしていると思います。次に、既知の可能なイベントを持つEVENTテーブルと、タイムスタンプを持つSUBSCRIPTION_EVENT_MAPをSUBSCRIPTIONからEVENTにマッピングします。

+0

ありがとうございました。サブスクリプションのステータスを確認するには(たとえば、ログインしようとしているときなど)、SUBSCRIPTION_EVENT_MAPの最新の関連レコードをクエリしますか? – eoinoc

+0

@eoinocはい、タイムスタンプによる最新のレコードです。 – Glenn

0

designintentionになります。ここではいくつかは---多く---多くの外で取るアプローチ:

あなたは履歴テーブルを使用することができます。

-- 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) 
) 

または参照と一緒に履歴テーブル:

-- 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) 
) 

または監査テーブルV1:

-- 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 
) 

または監査テーブルV2:

-- this could also act like a history table, so you can change the table name/purpose 
CREATE TABLE subscription_audit (
     subscription_id INT 
    , modified_column VARCHAR(255) 
    , value_old VARCHAR(255) 
    , value_new VARCHAR(255) 
    , modified_date DATETIME 
) -- Drawback here is that you'll have one audit record per column 
    -- , and you may have to add extra columns for other data types 
    -- , or convert your values to varchar or something else.. which isn't 
    -- a really good idea! I just want to present this in case you can 
    -- develop the idea you find interesting further 

私はあなたのRDBMSを知らないが、これはほぼこれでは十分な柔軟性がありません

関連する問題