2013-06-27 2 views
9

페이스 북과 같은 웹 메시징 시스템을 만들고 싶습니다. 나는 이미 데이터베이스 구조에 대한 많은 대안을 생각하고 있지만 어떤 것이 가장 좋은 방법인지는 확신 할 수 없다. 여기에 두 개의 대안이 있습니다. 첫 번째는 두 개의 테이블을 사용하고 두 번째는 세 개의 테이블을 사용하지만 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 

이 때문에, 나는,이 구조를 좋아 ERD의주기를합니다 메시지 테이블

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 

두 번째로 자체 참조 두 표, 하나의 메시지 헤더와 많은 메시지 (내용) 만 사용하십시오. author_id 자체는 메시지가 왼쪽 (보낸 사람) 또는 오른쪽 (받는 사람)에 있는지 여부를 알기 때문에 제거 할 수 없습니다. 이 시스템은 두 사람의 메시징 시스템 용입니다.

기본적으로이 두 테이블은 동일하지만이 메시징 시스템을 구현하는 가장 좋은 방법은 무엇입니까? 전에 고마워.

답변

12

힘든 방법 (몇 시간 전, 마지막 프로젝트 도중 ...)을 배운 후에 가능한 한 항상 물건을 분리하고 정리하도록 권유합니다. 자기 관계는 가능할 때 근처에 있지 않는 좋은 일입니다 (드문 예외가 있음). 첫 번째 인스턴스에서 클래스를 디자인하십시오. 일이 잘 맞는 데이터베이스를 구축하고 일을 단순하게 유지해야합니다. 내 취향은 ... 말했다보다 더 그려

Diagram


코드를 참조하는 것이 좋습니다

. here입니다.
가능한 쿼리는

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); 
  • 당신은 비트 필드에 내 개인적인 취향을 볼 수있을 것입니다 특정 헤더 메시지를 나열합니다. 예를 들어, 한 번만 두 사람 메시징 시스템을 사용하면 특정 from_id를 두 번 이상 기억할 필요가 없습니다.
  • 의심이 있으시길 바랍니다.

감사합니다,

레오나르도

+0

조금 될 수있는 메시지는 특정 메시지에 대한 응답의 순서로 체인해야 하는가 또는 그들은 타임 스탬프 – aeonsleo

+0

사용하여 응답 순서 (첫번째 높은 IDS)에 따라 표시되어야합니다 더 저렴하지만, 누군가가 인터넷없이 응답하고 효과적으로 메시지를 데이터베이스로 보내는 데 시간이 걸린다 고 가정 할 때 타임 스탬프 순서 지정 (물론 적절한 인덱스 사용)을 더 친숙하게 생각할 수 있습니다. 즉, 당신이 결정 :> –

+0

"is_from_sender"속성의 사용은 무엇입니까? –