2016-05-26 9 views
0

いくつかのオンラインチュートリアルに従うことで、システムイベントを追跡するデータベースを設計し始めました。簡単な例は、自動インクリメントIDを主キーとして割り当てることから始まります。私は自分のデータベースを見ましたが、本当にIDは必要ありません。すべての列のうち、タイムスタンプとデバイスIDは、一意のイベントを識別する2つの列です。レコードを主キーとして一意に識別する2つの列を使用する必要がありますか?

今の私のプログラムは、過去数分間にいくつかのイベントをシステムログから取得し、これらのイベントをデータベースに挿入することです。しかし、私は過去にあまりにも多くのイベントがデータベース内のものと重複している可能性があります。前述したように、タイムスタンプとデバイスIDは、イベントを一意に識別する2つのフィールドです。私の質問は、私は私のプライマリキーとしてこれらの2つのフィールドを使用し、今から "Insert ignore"を使用する必要がありますので、私は重複レコードを避けることができますか?

+0

[ここ](http://dba.stackexchange.com/questions/57548/how-to-set-up-multiple-fields-as-primary-key-in-mysql)これを行う方法は、あなたのコンポジットプライマリキーに何か間違ったことはありません。 –

答えて

1

ビジネスの値をテーブルの主キーとして使用することは避けてください。オートインクリメント、これの値。ビジネス要件が変わると、将来あなたの人生が楽になります:)

私たちは現在、このような状況に苦しんでいます。 2年間のビジネス・キーを主キーとする列を持ち、今は辛抱強くオートインクリメントを導入しています。

+0

重複したレコードの問題をどのように解決しますか? –

+1

@ return0あなたはまだ(デバイス、タイムスタンプ)のペア – Nikem

+1

のユニークな制約を持つことができます...そしてちょっと詳しく説明していますNikemのコメントでは、MySQLは(Bツリー)インデックス(プライマリキーと同じように)という独自の制約を実装しているため、O(log m)内の検索はすべてO m)。 – eggyal

0

今後、2つのテーブル間で一部の行をリンクするには、他のテーブルの外部キーを使用する必要があります。 1列の主キーでは簡単です。
ただし、今必要がない場合は、インデックス用の特別な列を作成する必要はありません。将来的には、このような列をオートインクリメントで追加してプライマリキーをそれに移動するためにテーブルを変更することができます。

+0

複合外部キーを持つことは可能です(実際には、MySQLは複合外部キー制約を強制できます)。 – eggyal

+0

@eggyal、はい。私は、1つの列の外来キーが多くの列のキーよりも単純であることだけを述べました。コンポジットの場合、外部キーを使用して各テーブルの2つ、3つまたはそれ以上の列を複製する必要があります。そして、これはテーブルとキーバッファーではるかに大きなサイズを取るでしょう。特殊な自動インクリメントのキー列を使用すると、これを回避できます。 – Andrew

関連する問題