必ずしも答えではないにしても、いくつかの考え:
明らかに、変更ログは必須であるため、ユーザーごとに 1 行の元の構造は解決策ではありません。したがって、次のいずれかの選択について話しています。
- 各ユーザーの情報セット全体のバージョンごとに 1 行。また
- 各ユーザーの情報のバージョンごとに 1 行
解決策 1 は、
userLog ( id INT, date TIMESTAMP, email VARCHAR, phone VARCHAR, address VARCHAR )
ソリューション 2 は、Wordpress のものに対応します。
umeta_id INT, user_id INT, meta_key VARCHAR, meta_value VARCHAR
あなたの質問 1: Solution2 の利点はわかりませんが、後でユーザーの (たとえば) Web サイトの URL や (たとえば) 好きな色もキャプチャすることにした場合は、meta_key を追加することでそれを行うことができます。 . しかし、Solution1 の下でこれを同様に簡単に行うことができます。
ALTER TABLE userlog ADD COLUMN WebSiteURL(etc)
それは難しいことではありません。あなたのショップの DBA が異常にドーベルマンのようでない限り ( ;) )。変更ログを保持しているため、(変更時に) 既存のすべてのユーザーの WebsiteURL 列は空白になります。しかし、それはまさにあなたが望んでいることです: システムが以前にそれをキャプチャしたことがなかったので、あなたは彼らの Web サイト URL を知りません。確かに、新しい列は NULLABLE である必要がありますが、ユーザー情報を取得するために使用している方法で必要な列として電子メール、電話、および住所が要求されない限り、「初期」データであってもそれは避けられない可能性があります。
私にとって、meta_key ソリューションの欠点は利点を上回ります。欠点は次のとおりです。
1 人のユーザーのユーザー情報を 1 つの
行にピボットするには、ピボット コードを開発する必要があります。1 つの行でユーザー情報を取得するすべての場所で、このコードを呼び出す必要があります。対照的に、Solution1 は
SELECT userID,[all user info] FROM userLog INNER JOIN (SELECT userID,MAX(datechanged) AS LatestDAteChanged FROM userlog GROUP BY userID) a ON userlog.userid=a.userID AND userlog.DateChanged=a.LatestDAteChanged
これはピボットよりもはるかに効率的です。UserID,DateChanged のインデックスを使用すると、これは風のように実行されます。
userinfo テーブル (Email、Email、Email、Email、Email) で複数回 meta_key 値を本当に保持したい場合を除き、追加の Meta_Key_Lookup テーブルが必要になります。
2 番目の質問:
究極のスペース効率については、はい、meta_key Solution2 が最適です。特に VARCHAR メタキーを使用せず、メタキー ID 値を使用し、別の meta_key ルックアップ テーブル (例: 1=Email、2=Phone など) がある場合。しかし、ストレージの価格が事実上ゼロであることと、このソリューションに伴う問題点を考えると、これが meta_key ソリューション 2 の決定的な議論になるとは思いません。
(メモ/考え: 私見ですが、値が変更されていないソリューション1で NULL 値を保持するというあなたの考えは間違った道です。最新の電子メール、次に電話、次にアドレス (個別に) を取得しようとするコーディング他のソリューションで必要とされるピボットとほぼ同じくらいコーディング/テストが難しく、サーバーを実行するのも困難です. そして、ストレージの削減は限界です. 何かが変わるたびに行全体を保持するだけです.例を挙げているだけで、実際のユーザー情報セットは 50 列幅です...)
私見ストレージの問題は決定的ではありません。それでは、SELECT/INSERT の効率に目を向けましょう。
この問題に関しては、Solution1 が依然として勝つと思います。挿入では、SOLution1 が勝ちます。ユーザーが情報内のすべてのフィールドを変更しても、1 行だけが挿入されます。SELECTS では、ソリューション 1 が再び勝利します。ユーザーごとに最新の情報 (上記のコード) を表示するだけで済みます。これは、SQL が最適化されている種類のものです。対照的に、Solution2 にはピボットが必要です。これは、SQL が苦手とするものです。