2013-06-27 45 views
9

Tôi muốn tạo một hệ thống nhắn tin web như facebook. Tôi đã nghĩ về nhiều thay thế cho cấu trúc cơ sở dữ liệu, nhưng không chắc chắn đó là thực hành tốt nhất cho nó. Tôi có hai lựa chọn ở đây, đầu tiên là sử dụng hai bảng, thứ hai là sử dụng ba bảng nhưng thực hiện một chu kỳ trong ERD.Cấu trúc cơ sở dữ liệu cho Hệ thống nhắn tin Web

đầu tiên: Hai Bảng, nơi bảng tin tham khảo bản thân

user 
---------- 
id 
name 

message 
-------------- 
id 
from_id 
to_id 
message_id --> refer to this table itself, to make me know which message is the topic 
subject 
content 
time 
status --> inbox, outbox, archive 
read --> read, unread 

Thứ hai: Ba Bảng, nhưng làm cho một chu kỳ trong ERD

user 
---------- 
id 
name 

message_header 
-------------- 
id 
from_id 
to_id 
subject 
status --> inbox, outbox, archive 
time 

message 
-------- 
id 
message_header_id 
content 
time 
read --> read, unread 
author_id 

Cá nhân, tôi thích cấu trúc này, bởi vì nó chỉ sử dụng một tiêu đề thư và nhiều thư (nội dung). Bản thân author_id không thể bị xóa vì tôi cần nó để biết liệu thông báo có ở bên trái (với tư cách người gửi) hay bên phải (là người nhận). Hệ thống này chỉ dành cho hệ thống nhắn tin hai người.

Về cơ bản, hai bảng này giống nhau, nhưng đó là phương pháp hay nhất để triển khai hệ thống nhắn tin này? Cảm ơn bạn trước.

Trả lời

12

Sau khi học một cách khó khăn (lần trước, trong dự án cuối cùng của tôi ...), tôi có thể khuyên bạn nên tách riêng và sắp xếp mọi thứ bất cứ khi nào có thể. Mối quan hệ tự thân là một điều tốt đẹp không nên ở gần, khi có thể (có những ngoại lệ hiếm hoi). Thiết kế các lớp học của bạn ở ví dụ đầu tiên; xây dựng sau đó một cơ sở dữ liệu trong đó mọi thứ phù hợp tốt, nhưng giữ mọi thứ đơn giản như họ cần. Sở thích của tôi là ... rút ra tốt hơn so với nói,

Diagram


Bạn có thể thích để xem mã. Đó là here.
Một truy vấn có thể liệt kê các tin nhắn từ một tiêu đề nhất định sẽ

SELECT 
    h.id AS `header_id`, h.`subject`, h.`status`, 
    m.id AS `message_id`, m.content, m.`time`, 
    IF(m.is_from_sender, x.`name`, y.`name`) AS `written_by` 
FROM (SELECT * FROM header WHERE id = @VAR) h 
    INNER JOIN message m ON (h.id = m.header_id) 
    INNER JOIN user x ON (h.from_id = x.id) 
    INNER JOIN user y ON (h.to_id = y.id); 
  • Bạn sẽ thấy một sở thích cá nhân của tôi để các lĩnh vực bit. Ví dụ, bạn không thực sự phải nhớ một từ nào đó nhiều hơn một lần, một khi mục đích của bạn là hệ thống nhắn tin hai người.
  • Tôi hy vọng bạn có nghi ngờ.

Kính trọng,

Leonardo

+0

thông điệp nên được xích theo lệnh của trả lời một tin nhắn nào đó hoặc họ phải được liệt kê theo timestamp – aeonsleo

+0

Sử dụng để trả lời (id cao đầu tiên) có thể là một chút rẻ hơn, nhưng bạn có thể xem xét việc đặt dấu thời gian (tất nhiên, với một chỉ số thích hợp) thân thiện hơn trong trường hợp, giả sử ai đó trả lời mà không cần internet và phải mất một thời gian để gửi thư đến cơ sở dữ liệu một cách hiệu quả. Điều đó nói rằng, bạn quyết định:> –

+0

Việc sử dụng thuộc tính "is_from_sender" là gì? –