我正在使用 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_unique_id 列,因为我只将它用于 sphinx 搜索。同样在评论表中,我可以删除 forum_id 列。
3)我在 updated_on和comment_count上排序的所有查询。这两个不是PK的,所以前两个查询看起来是个大问题..
感谢你的帮助