2

InnoDB を使用してフォーラム データベースを設計していますが、質問がいくつかあります。

以下の投稿コメントの表のデザイン

CREATE TABLE `my_posts` (
  `forum_id` mediumint(8) unsigned NOT NULL,
  `post_id` int(10) unsigned NOT NULL,          // not an auto increment
   subject   varchar(200) NOT NULL,
  `details` text NOT NULL,
  `access` tinyint(3) unsigned NOT NULL,  //private,friends,public
  `created_by` int(10) unsigned NOT NULL,
  `created_on` int(10) unsigned NOT NULL,
  `updated_on` int(10) unsigned NOT NULL,
  `comment_count` smallint(5) unsigned NOT NULL DEFAULT '0',
  `ip_address` int(10) unsigned NOT NULL,
   sphinx_unique_id  int(10) unsigned NOT NULL,  // not an auto increment
   PRIMARY KEY (`forum_id`,`post_id`,created_by)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `my_posts_comments` (
  `forum_id` mediumint(8) unsigned NOT NULL,
  `post_id` int(10) unsigned NOT NULL,          // not an auto increment 
  `comment_id` int(10) unsigned NOT NULL,
  `details` text NOT NULL,
  `created_by` int(10) unsigned NOT NULL,
  `created_on` int(10) unsigned NOT NULL,
  `ip_address` int(10) unsigned NOT NULL,
  PRIMARY KEY (`forum_id`,`post_id`,comment_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

forum_id、post_id、created_by に基づいたクエリと、 updated_on 、comment_count の並べ替えがあります。

SELECT * FROM my_posts  WHERE access=public ORDER BY updated_on DESC      //OR ASC
SELECT * FROM my_posts  WHERE access=public ORDER BY comment_count DESC      //OR ASC
SELECT * FROM my_posts WHERE forum_id=?  and access=public ORDER BY updated_on DESC      //OR ASC
SELECT * FROM my_posts WHERE forum_id=?  and access=public  ORDER BY comment_count DESC   //OR ASC
SELECT * FROM my_posts WHERE created_by=?  ORDER BY updated_on DESC     //OR ASC
SELECT * FROM my_posts  WHERE created_by=(Friends_ids) AND access=(public,friends)   ORDER BY updated_on DESC      //OR ASC 
SELECT * FROM my_posts WHERE forum_id=? AND  post_id=?  
SELECT * FROM my_posts_comments WHERE forum_id=? AND post_id=?

1) forum_id、post_id、created_byの複合主キーであるため、 created_byで調整するだけでアクセスする際に問題が発生します。created_byでクエリを実行するのに最適な設計は何 ですか? 複合キーからcreated_byを削除して、それにインデックスを追加することはできますか? ここでクラスターのパフォーマンスを失います..

2) フォーラム レベルで post_id をインクリメントする最良の方法は何ですか? または、テーブル レベルでインクリメントできますか。例えば

サンプルデータ (フォーラムレベル)

 FORUM_ID  POST_ID
    1         1
    1         2
    1         3
    1         4
    2         1
    2         2
    2         3
    2         4
    2         5

またはテーブルレベル

 FORUM_ID  POST_ID
1          1
1          2
1          3
1          4
2          5
2          6
2          7
2          8
2          9

上記のテーブル レベルのインクリメントを使用できる場合は、sphinx 検索にのみ使用しているため、sphinx_unique_id 列を削除できます。また、コメント テーブルで、forum_id 列を削除できます。

3) updated_oncomment_countで並べ替えているすべてのクエリ 。これらの 2 つは PK ではないため、最初の 2 つのクエリは大きな問題のように見えます..

ご協力ありがとうございます

4

0 に答える 0