我正在开发一个Web应用程序,使用户能够发布类似于Twitter的简短状态更新。我能想到存储这些帖子的唯一方法是有一个大的“status_updates”表来存储每个用户的状态更新:
--------------------------------------
| table: status_updates |
-------------------------------------|
| id | user_who_posted | update_text |
--------------------------------------
此方法需要类似此SQL查询的内容来获取每个用户的更新:
SELECT * FROM status_updates where user_who_posted="username"
我觉得效率不高。有没有更好的方法呢?
答案 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'
显然,对表进行索引和潜在分区对于可伸缩性可能很有用。