2009-06-14 106 views
1

我正在开发一个Web应用程序,使用户能够发布类似于Twitter的简短状态更新。我能想到存储这些职位的唯一途径是让存储每个用户的状态更新一个大的“status_updates的”表:将状态更新存储在数据库中的更好方法是什么?

-------------------------------------- 
| table: status_updates    | 
-------------------------------------| 
| id | user_who_posted | update_text | 
-------------------------------------- 

这种方法需要这样的SQL查询来获取每个用户的更新:

SELECT * FROM status_updates where user_who_posted="username" 

我认为这不会非常低效。有没有更好的方法来做到这一点?

+0

我敢肯定你还希望在该表中有一个datetime或timestamp列:我无法想象应用程序的一个变体,它描述了当状态更新发布时无关紧要的地方! – 2009-06-14 03:46:05

回答

3

构建一个用户表,并且user_id是该用户表的整数外键。然后,在user_id字段上建立索引以允许快速检索。

简而言之:

status_updates: 
-------------------------------------- 
| status_id | user_id | status | 
-------------------------------------- 
|   1 |  1 | Woot! | 
-------------------------------------- 
|   2 |  1 | Yeah! | 
-------------------------------------- 
|   3 |  2 | Hello! | 
-------------------------------------- 

users: 
-------------------------- 
| user_id | username | 
-------------------------- 
|  1 | 'Joe'  | 
-------------------------- 
|  2 | 'John' | 
-------------------------- 

然后,检索,你可以这样做:

select 
    u.username, 
    s.status 
from 
    status_updates s 
    inner join users u on 
     s.user_id = u.user_id 
where 
    u.username = 'John' 

这将检索:

------------------------- 
| username | status | 
------------------------- 
| John  | Hello! | 
------------------------- 

与你会做什么。只要你建立你的索引,这将在数百万行上表现得非常好。你使用的是什么关系数据库管理系统,所以我可以为你指出正确的位置?

1

只要您正确设置用户的status_updates表的索引,这实际上可以非常有效。

如果你真的担心桌子变得非常大,你可能想看看你的数据库的horizontal partitioning

1

这将是更快地没有一个字符串作为搜索条件的一部分,而是有你的用户替换为代理键:

SELECT update_text 
FROM status_updates 
INNER JOIN users 
    ON status_updates.user_id = users.user_id 
WHERE users.username = 'username' 

显然,索引和潜在的分区您的表可能是有用的可扩展性。

相关问题