2009-07-25 6 views
1

私は書いていない古いロギングコードを修正しています。このようなテーブルにより良いロギングデザインかSQLマジック?

Sarah [user_id] added a user [message], slick101 [reference_id, reference_table_name] 

そうみたいに壊れ
Sarah added a user, slick101 
Mike deleted a user, slick101 
Bob edited a service, Payment 

:これは次のようにメッセージをログに記録のMySQLとPHPで書かれたイベントロガー、ある

log 
--- 
id 
user_id 
reference_id 
reference_table_name 
message 

ますのでご注意ください上記の例のメッセージの "Bob"と "Payment"は実際の名前ではなく、他のテーブルのIdです。名前を取得するには、結合が必要です。

参照_IDだけが格納されているため、正しいテーブルで適切な名前を見つけるための "reference _ table _ name"のようです。 - 統計のIDを持つことがどれだけ優れて

select * from log l 
join {{reference_table_name}} r on r.id = l.reference_id 

私は彼がこのテーブルのレイアウトを行っていたところ、私が見ると思う:どういうわけか私はreference_table_nameに保存されているテーブル名に参加することができれば、これはおそらくそうのように、良いでしょう単一の列にメッセージ全体を格納する代わりに(テキスト解析を必要とする)今私は疑問に思っています..

もっと良い方法があるのか​​、それとも何とかして結婚することが可能ですか?

乾杯

答えて

1

がモデリングに基づいてジョインを取得するには、次の2つの段階のプロセスを見ていると思います:

  1. は、特定のメッセージ
  2. のログからテーブル名を取得します。実際のクエリを文字列として構築することにより、動的SQLを使用します。 IE:

    "リットルをSELECT * LOG Lから登録しよう "+ tableNameの+" R ON r.id = l.reference_id"

レコードがありませんので、ログに記録された欠失に値がたくさんありませんに参加すると、削除されたものが表示されます。

アプリケーションにはどのくらいの履歴が必要ですか?

誰が過去に何ヶ月/何年に何をしたのか知る必要がありますか?レコードが必要な場合は、テーブルからアーカイブ&を削除する必要があります。

  • ENTRY_USERID、NOT NULL
  • ENTRY_TIMESTAMP、DATE、NOT NULL
  • UPDATE_USERID、NOT NULL
  • UPDATE_TIMESTAMP:あなたはすべての歴史を必要としない場合は、各テーブルの上に、次の監査列を使用することを検討してください、DATEは、

、NOT NULLこれらの列は、あなたが&、そして誰が最後に正常に更新されたレコードを作成したかを知ることができます。私はケースバイケースで監査テーブルを作成したいと思います。ユーザーが必要とする機能に依存します。

関連する問題