2009-06-14 8 views
1

私は、ユーザーがTwitterに似た短いステータスアップデートを投稿できるようにするWebアプリケーションを開発しています。ステータス更新をデータベースに保存するには、どのような方法が良いですか?

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

この方法は、各ユーザーの更新情報を取得するには、このSQLクエリのようなものが必要です:私はこれらの記事を保存すると考えることができる唯一の方法は、すべてのユーザーのステータスの更新を保存する大規模な「status_updates」テーブルを持つことです

SELECT * FROM status_updates where user_who_posted="username" 

と私はあまり効率的ではないと思います。これを行うより良い方法はありますか?

+0

このテーブルにdatetimeタイムスタンプやタイムスタンプカラムが必要だと確信しています。状況更新が投稿されたときに、どこに関連しないかを説明するアプリの変種は想像できません。 –

+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! | 
------------------------- 

は何をすることで行います。それは、あなたのインデックスを正しく構築する限り、何百万行ものパフォーマンスを発揮します。何のRDBMSを使用しているのですか?それでは、私はあなたに正しい場所を指摘できますか?

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' 

、インデックス化し、潜在的にあなたのテーブルを分割するために有用である可能性スケーラビリティ。

関連する問題