2009-06-14 7 views
1

Ich entwickle eine Webanwendung, die es Benutzern ermöglicht, kurze Statusaktualisierungen ähnlich Twitter zu posten. Die einzige Möglichkeit, die ich denken kann, diese Beiträge zu speichern, ist einen großen „status_updates“ Tisch haben, dass jeder Benutzer-Status-Updates speichert:Was ist eine bessere Möglichkeit, Statusaktualisierungen in einer Datenbank zu speichern?

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

Diese Methode etwas wie diese SQL-Abfrage erfordert von jedem Benutzer Updates zu erhalten:

SELECT * FROM status_updates where user_who_posted="username" 

und ich denke, das wäre nicht sehr ineffizient. Gibt es einen besseren Weg, dies zu tun?

+0

Ich bin mir ziemlich sicher, dass Sie auch eine Datetime- oder Timestamp-Spalte in dieser Tabelle haben wollen: Ich kann mir eine Variante der App, die Sie beschreiben, nicht vorstellen, WENN ein Statusupdate gepostet wurde! –

+0

Sie haben Recht, ich habe die Tabelle vereinfacht, um eine klarere Frage zu stellen. – JasonV

Antwort

3

Erstellen Sie eine Benutzertabelle und geben Sie user_id als Integer-Fremdschlüssel für diese Benutzertabelle an. Erstellen Sie dann einen Index für das Feld user_id, um einen schnellen Abruf zu ermöglichen.

Kurz:

status_updates: 
-------------------------------------- 
| status_id | user_id | status | 
-------------------------------------- 
|   1 |  1 | Woot! | 
-------------------------------------- 
|   2 |  1 | Yeah! | 
-------------------------------------- 
|   3 |  2 | Hello! | 
-------------------------------------- 

users: 
-------------------------- 
| user_id | username | 
-------------------------- 
|  1 | 'Joe'  | 
-------------------------- 
|  2 | 'John' | 
-------------------------- 

Dann abzurufen, würden Sie dies tun:

select 
    u.username, 
    s.status 
from 
    status_updates s 
    inner join users u on 
     s.user_id = u.user_id 
where 
    u.username = 'John' 

Diese abruft:

------------------------- 
| username | status | 
------------------------- 
| John  | Hello! | 
------------------------- 

mit dem Tun, was man so will. Das wird in Millionen von Zeilen sehr performant sein, solange Sie Ihre Indizes richtig aufbauen. Welche RDBMS verwenden Sie, damit ich Sie auf den richtigen Ort dafür hinweisen kann?

1

Dies kann tatsächlich sehr effizient sein, solange Sie einen Index für die Tabelle status_updates auf Benutzer ordnungsgemäß einrichten.

Wenn Sie sich wirklich Sorgen machen, dass der Tisch sehr, sehr groß wird, möchten Sie vielleicht in horizontal partitioning Ihrer Datenbank (en) schauen.

1

Es wäre schneller, nicht eine Zeichenfolge als Teil Ihrer Suchkriterien haben, und stattdessen Ihre Benutzer mit einem Ersatzschlüssel ersetzt haben:

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

Offensichtlich Indizierung und könnte möglicherweise Ihre Tabellenpartitionierung nützlich sein Skalierbarkeit.

Verwandte Themen