2012-01-13 4 views
0

これについては多くの議論があります。私はちょうどこれに関するあなたの提案を求めています。基本的に、私が使用しているのはPHPとMySQLです。日付/時刻を扱う際の複合主キーまたはサロゲート

  users 
------------------------------ 
uid(pk) | username | password 
------------------------------ 
    12 | user1 | hashedpw 
------------------------------ 

ユーザによる更新情報を格納し、別のテーブル

   updates 
-------------------------------------------- 
uid |  date   |  content 
-------------------------------------------- 
12 | 2011-11-17 08:21:01 | updated profile 
12 | 2011-11-17 11:42:01 | created group 
-------------------------------------------- 

をユーザーのプロファイルページは、ユーザーの5件の最新の更新が表示されます:私は行くusersテーブルを持っています。質問は次のとおりです。

  1. updatesテーブルの場合は、UIDからの参照UIDとの複合主キーとしてUID日付の両方を設定することが可能であろうusers
  2. または、に別の列を作成する方がよいでしょうかは自動的にインクリメントされ、プライマリキーとして使用されます(uidはFKからuidへusers)。 (1アンダー)

答えて

2

あなたのアイデアは、ユーザーが1秒以内に2「更新」を行うことはありませんできることを前提にかかっています。それは非常に貧しいデザインです。あなたは将来どのような機能を実装するのか分かりませんが、1日のクリックで2つのアクション、したがってこの表の2行につながる可能性があります。

私はこれをロギングテーブルとみなしているので、「更新」は引用されています。そして、あなたは将来あなたがどこかにログしておきたいことを知っています。

珍しいプライマリキーの場合:そうしないでください。ほとんどの場合、あなたの顔にはいつも戻ってくるので、後で適切な自動インクリメントキーを追加するためには多くの作業が必要です。

+0

あなたは絶対に正しいです。私はあまりにも "人間的に"考えていたと思う。しかし、テーブルを設定する良い方法は何ですか?助言がありますか? –

+1

'logid/uid/ts/eventtype/details'ここで、' logid'はPKオートインクリメント、 'ts'はタイムスタンプ列、' eventtype'は自由形式ですが短い(varchar 16文字)、 'details'は自由形式で長すぎない(varchar 1024)。タイプ+詳細のイベントを分割すると、「すべてのログイン」、「すべての新しいグループ」などを簡単にフィルタリングできます。 – mvds

+0

Gotcha。助けてくれてありがとう。 –

0

これは要件によりますが、3番目の可能性は、鍵(uid、日付、内容)を作成できることです。あなたはまだサロゲートキーを追加することができますが、その場合はおそらくキー(コンポジットとサロゲートの両方)を実装する必要があるでしょう。いずれかの選択をしなければならないと思って間違えてはいけません。

サロゲートを追加するのに役立つかどうかは、その使用方法によって異なります。サロゲートを追加する必要がない限り、サロゲートを追加しないでください。いずれにしても、私はユーザーテーブルを参照する外部キーと仮定します。