2009-06-14 5 views
1

Я разрабатываю веб-приложение, которое позволит пользователям публиковать короткие обновления статуса, похожие на 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: я не могу представить вариант приложения, которое вы описываете, где это было бы неважно, КОГДА было опубликовано обновление статуса! –

+0

Вы правы, я упростил таблицу с целью создания более четкого вопроса. – JasonV

ответ

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' 

Очевидно, индексирование и потенциально разбиение таблицы может быть полезно для масштабируемость.

Смежные вопросы