制作这个MySQL数据库的最有效方法是什么?

时间:2011-01-03 22:27:20

标签: mysql database-design

好的,我有一个数据库,里面有一个用于存储分类帖子的表,每个帖子属于不同的城市。出于此示例的目的,我们将调用此表posts。此表包含列:

id        (INT, +AI),
cityid    (TEXT),
postcat   (TEXT), 
user      (TEXT), 
datatime  (DATETIME), 
title     (TEXT), 
desc      (TEXT), 
location  (TEXT)

该数据的一个例子是:

'12039',
'fayetteville-nc',
'user@gmail.com',
'December 28th, 2010 - 11:55 PM',
'post title',
'post description',
'spring lake'

id是自动递增的,cityid是文本格式(这是我认为一旦数据库很大我将失去性能的地方)......

最初我计划为每个城市设置一个不同的桌子,现在由于用户必须可以选择在多个城市进行搜索和发布,我想我需要在一个桌子中使用它们。当我每桌有一个城市时,一切都很完美,我可以:

SELECT       *
FROM         `posts`
WHERE        MATCH (`title`, `desc`, `location`)
    AGAINST ('searchtext' IN BOOLEAN MODE)
  AND        `postcat` LIKE 'searchcatagory'

但是,当我尝试一次搜索多个城市时,或者列出所有用户帖子以供删除或编辑时,我遇到了问题。

所以看起来我必须有一个包含所有帖子的表,并且还匹配另一个FULLTEXT字段:cityid。我猜我需要全文,因为如果用户选择整个州,而我的cityid是“fayetteville-nc”,我需要将cityid与“-nc”匹配,这只是一个假设我会喜欢另一种方式。这个数据库可以在6个月内轻松达到一百多万行,而对四列的全文搜索可能会很慢。

我的问题是,有更好的方法来更有效地做到这一点吗?数据库现在没有任何内容,除了我做的一些测试帖。因此,如有必要,我可以完全重新设计表结构。我对所有建议持开放态度,即使这只是一种更有效的方式来执行我的查询。

1 个答案:

答案 0 :(得分:2)

是的,所有帖子的一张表听起来都合情合理。 post表的常规设计也是city_id,指的是city表中的id。每个城市也有一个state_id,引用状态表中的id,类似地,每个州都有一个country_id引用国家表中的id。所以你可以写:

SELECT $columns
FROM posts JOIN city ON city.id = posts.city_id
WHERE city.tag = 'fayetteville-nc'

一旦你把城市带到一个单独的桌子上,你可能更有意义地做到city-to-city_id预先解决。例如,如果你有一个城市从下拉列表中选择,那么这种情况自然会发生。但是,如果您要将自由文本输入搜索字段,则可能需要采用不同的方式。

您还可以搜索给定状态(或状态集)中的所有帖子:

SELECT $columns
FROM posts
     JOIN city ON city.id = posts.city_id
     JOIN state ON state.id = city.state_id
WHERE state.tag = 'NC'

如果您想要更加花哨或国际化,您可能需要更灵活的方式将地点安排到一个等级(例如,您可能需要城区,县,跨国地区,国内地区(中西部,东海岸等) )但现在保持容易:)