什么是在数据库中存储状态更新的更好方法?

时间:2009-06-14 03:36:20

标签: sql database database-design

我正在开发一个Web应用程序,使用户能够发布类似于Twitter的简短状态更新。我能想到存储这些帖子的唯一方法是有一个大的“status_updates”表来存储每个用户的状态更新:

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

此方法需要类似此SQL查询的内容来获取每个用户的更新:

SELECT * FROM status_updates where user_who_posted="username"

我觉得效率不高。有没有更好的方法呢?

3 个答案:

答案 0 :(得分: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!  |
-------------------------

按照你的意愿做。只要您正确构建索引,这将在数百万行上非常高效。您使用的是什么RDBMS,所以我可以为您指出正确的位置?

答案 1 :(得分:1)

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

如果您真的担心桌子变得非常非常大,您可能需要查看数据库的horizontal partitioning

答案 2 :(得分:1)

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

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

显然,对表进行索引和潜在分区对于可伸缩性可能很有用。