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. 保存する必要があるレコードの量を考慮すると、 my AUTO_INCREMENTing ' ' をプライマリおよび一意のキーとしてのみ使用するのが最善ですか?post_id

  2. post_id' ' と ' ' の両方user_idを複合キーとして使用して、主キーおよび一意のキーとして使用する必要がありますか? これが最善の場合、他のテーブルで外部キーとして使用するにはどうすればよいですか? これらのテーブルに列として追加するだけですか?

また、それぞれの長所と短所 (ある場合) と、使用するエンジンに関するアドバイスを教えてください。2番目のオプションを使用する場合、Innodbが最適だと思います。知らない。

4

1 に答える 1

1

自動インクリメント フィールドを主キーとして使用するか、post_id と user_id を使用する複合キーとして使用するかは、基本的に次のようになります。

テーブルに子テーブルがある場合、投稿のpostsを使用してそれらのテーブルに対してクエリを実行したいと思うことはありますか?user-id

たとえば、他のユーザーが投稿にコメントすることが許可されていて、commentsテーブルがある場合、元の投稿のクエリを実行するコメント テーブルからデータを取得する理由がわかりますuser_idか?

その場合、自動インクリメント フィールドを使用するとposts、子テーブルのデータに基づいてクエリを実行するために、常に親テーブル ( ) に結合する必要がありuser_idます。

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

これは、特にテーブルに数百万行のデータがあると予想される場合に、パフォーマンス ヒットを引き起こす可能性がありpostsます。

user_idフィールドを使用して子テーブルをクエリする必要がない場合は、自動インクリメントを使用しますpost_id十分な大きさのフィールドを定義するようにしてください。(数百万のレコードを除外する場合、post_id フィールドを小さくしすぎたために、最大で数百万のレコードだけにとどまることは望ましくありません)。

于 2012-01-08T20:17:06.140 に答える