2009-07-17 56 views
5

Tôi hiện đang làm việc để tạo một hệ thống nhắn tin tương tự như Facebook. Cụ thể hơn, các tin nhắn riêng trên Facebook - hoàn chỉnh với Hộp thư đến, Tin nhắn đã gửi, "Chưa đọc" và "Đã đọc".Thiết kế cơ sở dữ liệu cho nhắn tin trong Facebook

Có ai quen với cấu trúc cơ sở dữ liệu tương tự với những gì Facebook hiện đang sử dụng cho hệ thống nhắn tin của họ không?

Cảm ơn!

Trả lời

0

Tôi tin rằng Facebook đang sử dụng hệ thống hoàn toàn tùy chỉnh không sử dụng "Cơ sở dữ liệu" truyền thống. Điều đó nói rằng, anh chàng này đã làm ngược lại một sơ đồ sẽ trông như thế nào: http://blogs.x2line.com/al/archive/2007/06/02/3124.aspx

Hóa ra họ đang sử dụng cái gì đó gọi là Casandra. Bạn cũng có thể truy cập vào số google code project directly (liên kết bị tắt cho tôi). Ngắn gọn là họ sử dụng một cái gì đó giống như BigTable của Google chứ không phải MySQL.

CHỈNH SỬA: Xem bài đăng của Josh Smith ở trên để biết chỉnh sửa trên bài đăng này.

+0

cách chúng tôi có thể triển khai điều này trong MySQL? –

4

Dưới đây là một cái gì đó bạn có thể thấy hữu ích để bắt đầu:

Bắt đầu với 2 bảng, một trong đó sẽ chứa thông điệp thực tế, và một trong những bạn sẽ sử dụng để theo dõi các mối quan hệ giữa các thông điệp

Đó có thể là một cái gì đó như thế này:

private_messages tbl: 
id 
date_sent 
title 
content 
status ENUM ('unread', 'read') DEFAULT 'unread' 

private_message_relation tbl: 
id 
message_id 
sender_id 
receiver_id 

Sau đó, bạn có thể thêm ràng buộc vào các id của tbl quan hệ cho mục đích toàn vẹn dữ liệu.

+0

Điều gì sẽ xảy ra nếu ai đó gắn cờ nhận xét khi anh ấy/cô ấy nhìn thấy dòng chủ đề, nhưng chưa đọc tin nhắn? Hoặc nếu anh ta/cô ấy đọc nó, sau đó cờ nó? IMHO, "đọc" và "được gắn cờ" phải là các boolean độc lập. –

+0

Tôi tin rằng điều này có thể phụ thuộc vào bạn đang triển khai. Tôi đã chỉnh sửa và xóa nó khỏi trường trạng thái để mọi thứ trở nên đơn giản. Tuy nhiên, tôi tin rằng điều này có thể stil làm việc nếu bạn không cho phép người dùng gắn cờ một tin nhắn cho đến khi nó không được mở, hoặc nếu bạn xem xét rằng nếu một tin nhắn được gắn cờ, nó đã được màu đỏ. – Sylvain

+0

nếu Người dùng A xóa các thư tôi muốn Người dùng B vẫn còn bản sao của nó. làm thế nào tôi có thể làm điều đó với điều này? –

3

Để sửa lại nhận xét của Joe, Facebook sử dụng Cassandra để tìm kiếm hộp thư điện tử chứ không phải nhắn tin. Và "kỹ thuật đảo ngược" đó là các lớp đối tượng của nền tảng Facebook, mà tôi không nghĩ là có một cái nhìn rất đại diện về thiết kế cơ sở dữ liệu chút nào.

+1

Hoàn toàn đồng ý. – dcolumbus

0

Cách tiếp cận bên dưới có thể giúp bạn sắp xếp. Đây là cơ sở tốt cho cả trò chuyện và nhắn tin, ở đó với trò chuyện, bạn có thể thăm dò ý kiến ​​các tin nhắn gần đây từ phía khách hàng và tát vào giao diện người dùng trực quan.

Message { 
    MessageId, 
    SenderId, -- Foreign key User.UserId 
    DateSent, 
    Subject, 
    Content, 
    Attachment, -- can be null or default to a 0 
    ... 
} 

UserMessage { 
    Id, 
    MessageId, -- Foreign key Message.MessagId 
    RecepientId, -- Foreign key User.UserId 
    DateRead -- can default to year 1900 if you do not want to deal with nulls 
} 

User { 
    UserId 
    UserName 
    ... 
} 

Queries  

Read = UserMessage where DateRead > year 1900 (or not equal to null) 
Inbox = UserMessage where RecepientId = Me.UserId 
Sent = Message where SenderId = Me.UserId 
Conversation = Group by Subject 
Attachment = (Simple = Path to attachment file. || Better = DocumentId ... see below) 

Attachment 

Document { 
    int DocumentId, 
    int DocTypeId, 
    virtual DocumentType DocumentType, 
    string FileName, 
    int UserId, 
    string mimeType, 
    float fileSize, 
    string storagePath, 
    int OrganizationId, 
    string fileHash, 
    string ipAddress, 
    DateTime DateCreated = DateTime.Now; 
} 
Các vấn đề liên quan