2012-01-08 17 views
1

私は、mysqlに(近い将来に)何百万もの投稿を保存しなければならないテーブルを持っています。ここでは単純化された構造は、(私の質問は、それに基づいているので、私は私の主キーを示すものではありませんでした)です:この状況で自然キーと複合キーの違いは何ですか

CREATE TABLE `posts` (
    `post_id` INT NOT NULL AUTO_INCREMENT, 
    `user_id` BIGINT(20) NOT NULL, 
    `title` VARCHAR(100), 
    `content` TEXT 
) ENGINE = MyISAM; 

私の質問は:私のキーを定義するための最良の方法は何ですか?

  1. それだけで、プライマリおよび保存する必要のあるレコードの量を考慮した固有のキーとして「post_id」をINGの私のAUTO_INCREMENTを使用するのが最適ですか?

  2. post_id」と「user_id」の両方をプライマリキーとユニークキーとして使用する複合キーとして使用する必要がありますか?これが最善の場合、他のテーブルで外部キーとしてどのように使用するのですか?これらのテーブルの列として単に追加するだけですか?

あなたも喜ばでしそれぞれ使用するENGINE上、おそらくいくつかのアドバイスの長所と短所(もしあれば)を示しています。私はInnodbが2番目のオプションを使うと最高になると思います。知りません。

あなたpostsテーブルに子テーブルを持っている場合は、あなたが必要になります。主キーまたはpost_idのを使用して複合キーとUSER_IDは、基本的には次に降りてくるだろうとあなたは、自動インクリメントフィールドを使用するかどうか

+0

[テーブルの主キーのベストプラクティスは何ですか](http://stackoverflow.com/questions/337503/whats-the-best-practice-for-primary-keys-in-tables) – millimoose

+0

理論的には、すべての列が簡単にハッシュ可能(整数など)であれば、複数列の索引にアクセスする場合には、単一列の索引に比べてパフォーマンスが大幅に低下すべきではありません。 – millimoose

+1

前回の回答が見つかった可能性があります。http://stackoverflow.com/questions/4419499/mysql-nosql-help-me-to-choose-the-right-one-on-a/4421601#4421601 –

答えて

1

投稿のuser-idを使用してこれらのテーブルをクエリしますか?

たとえば、commentsテーブルがある他の用途で投稿をコメントすることが許可されている場合は、元の投稿のuser_idを照会するコメントテーブルからデータを取得する理由が表示されます?

SELECT comments.* 
FROM comments 
INNER JOIN posts ON 
    posts.post_id=comments.post_id 
WHERE posts.user_id='scott.korin' 

その場合は、自動インクリメントフィールドを使用して、あなたは常にuser_idに基づいて、子テーブルの上のデータを照会するために、親テーブル(posts)に加入する必要があるとしています

これはパフォーマンスが低下する可能性があります。特に、postsテーブルに何百万行ものデータがあることが予想される場合は、パフォーマンスが低下する可能性があります。

user_idフィールドを使用して子テーブルを照会する必要がない場合は、自動インクリメントpost_idを使用します。 フィールドを十分大きく定義してください。(何百万ものレコードを除いて、post_idフィールドを小さくしすぎたため、最大数百万レコードしか詰まっていないようにしたい場合)。

+0

ありがとうございます。それは本当に役立ちます。ちょっとフォローアップの質問:AUTO_INCREMENTの主キーは信頼できますか?彼らは私が知らないかもしれない問題がありますか?私は 'user_id'を使ってコメントを検索するつもりはありませんでした。私は模範を作っていただけで、使用する他の分野は見つけられませんでした。申し訳ありません。 – Sthe

+0

私が知る限り、彼らはかなり信頼できるですが、私はMicrosoft SQL Serverでの使用にもっと精通しています:) –

関連する問題