Как лучше хранить обновления статуса в базе данных? - PullRequest
1 голос
/ 14 июня 2009

Я занимаюсь разработкой веб-приложения, которое позволит пользователям публиковать короткие обновления статуса, подобные Twitter. Единственный способ сохранить эти записи - это иметь большую таблицу status_updates, в которой хранятся КАЖДЫЕ обновления статуса пользователя:

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

Этот метод требует что-то вроде этого SQL-запроса для получения обновлений каждого пользователя:

SELECT * FROM status_updates where user_who_posted="username"

и я думаю, что это не будет очень неэффективно. Есть ли лучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 14 июня 2009

Создайте пользовательскую таблицу, и пусть 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 голос
/ 14 июня 2009

Быстрее не указывать строку в качестве критерия поиска, а вместо этого заменить вашего пользователя суррогатным ключом:

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

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

1 голос
/ 14 июня 2009

Это на самом деле может быть очень эффективным, если вы правильно настроили индекс для таблицы status_updates для пользователя.

Если вы действительно беспокоитесь о том, что таблица станет очень, очень большой, вы можете рассмотреть горизонтальное разбиение вашей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...