2010-02-10 2 views
5

우리는 인기있는 사이트가 있다고 가정합니다. 우리는 사용자들 사이에서 메일과 같은 메시징을 구현해야합니다.메일과 같은 메시징을위한 확장 가능한 MySQL 데이터베이스

사용자 (USER_ID)

메시지 (MESSAGE_ID, SENDER_ID (참조 USER_ID), receiver_id (참조 USER_ID), 제목, 본문) : 일반적인 솔루션은이 개 테이블을 사용하는 것입니다.

이 방법이 개 크게 제한

  1. 모든 사용자의 모든 메시지가 이어지는 하나 개의 테이블에 저장 고부하 및 전반적인 데이터베이스 성능을 감소입니다되어있다.
  2. 누군가가 여러 사용자에게 동시에 메시지를 보내야하는 경우 메시지는 (recipients_count) 번 복사됩니다.

    사용자 (USER_ID)

    Sent_messages (sent_id, SENDER_ID (참조 USER_ID), 제목, 본문)

    Received_messages :

다른 솔루션은 3 개 테이블을 사용 (sent_id, receiver_id (사용자 ID 참조), 제목, 본문)

received_messages의 제목과 본문이 sent_messages의 해당 필드에서 복사됩니다.

이 방법은 실제로 전송 삭제할 수있는 또 다른

  • 사용자에게 하나 개의 테이블에서 정보를 복사하여 데이터베이스를 비정규

    1. 로 연결/수신기/발신자에서 그들을 제거하지 않고 메시지를 받았다.
    2. 메시지는 약 2 배의 공간이 필요합니다.
    3. 각 테이블에는 약 2 배 적은 양이로드됩니다. 고려 디자인의

      1. 어느 하나가 높은 부하 및 확장 성을 위해 더 나은 :

      그래서 여기에 질문을 간다? (나는 두 번째 것 같아)

    4. 높은 부하를 처리 할 수있는 또 다른 데이터베이스 디자인이 있습니까? 이게 뭐야? 한계는 무엇입니까?

    고마워요!

    P. 이 확장 성 문제에 도달하기 전에 사이트가 매우 성공적이어야한다는 것을 이해하지만 필요한 경우 어떻게해야하는지 알고 싶습니다. 현재 내가 다니엘 Vassallo에 의해 제안 된 디자인을 사용하게 될 첫 번째 버전에 대한

    UPDATE

    .그러나 앞으로 모든 것이 정상이면 디자인은 두 번째 디자인으로 변경 될 것입니다. 그것에 대해 내 걱정을 완화시키기위한 Evert에게 감사드립니다.

  • 답변

    3

    메시지를 여러 수신자에게 보내는 경우 메시지 본문을 여러 번 복사하지 않아도됩니다.

    • 사용자 (USER_ID)

    • 메시지 (MESSAGE_ID, SENDER_ID, 제목, 몸)

    • : 여기 당신이 고려할 수있는 또 다른 옵션은 received_messages (message_id, user_id, address_mode, deleted)

    이 모델은 이메일과 유사한 트위터처럼 보이지만 이점이있을 수 있습니다.

    규칙은 그 각각의 메시지에서 참조 SENDER_ID

    • 메시지가 단지 하나의 사용자에 의해 전송 될 수있다.
    • 각 수신자는 received_messages 테이블에 정의됩니다. address_mode 필드는 메시지가받는 사람에게 직접 보내지는지 또는 CC로 보내지는지 또는 BCC로 보낼지를 정의 할 수 있습니다. 이 필드는 선택 사항입니다.
    • 받는 사람이 삭제 한 메시지는 received_messages 테이블에서 삭제 된 플래그를 표시합니다.
    • 전달 된 메시지와 회신 된 메시지를 새 sender_id로 다시 작성해야합니다. 그런 다음 메시지 본문을 수정할 수 있습니다. 사용자는 일반적으로 여러 수신자에게 메시지를 보낼 것입니다, 특히,

      • 이 원래의 질문에 언급 된 두 가지 옵션보다 적은 공간을 차지 :

    • 은 장점의 일부입니다.
    • 메시지가 중복되지 않으므로 메시지 테이블을 쉽게 캐싱합니다.
    • 받는 사람이 메시지를 삭제해도 메시지가이 사용자에게 전송 된 정보는 지워지지 않습니다. received_messages 테이블에서 'deleted'로 표시됩니다.
    • 그리고 정규화 된 모델도 있습니다.

    대부분의 응용 프로그램에서 위 모델과 함께 낙관적 격리 수준을 사용하는 경우 메시지가 초당 몇 초의 비율로 교환 될 것으로 예상되는 경우에도 성능 문제가 없어야합니다. 다른 한편으로는 초당 수백 또는 수천 개의 메시지를 기대한다면 다른 옵션을 고려해야 할 수도 있습니다.

    +0

    감사!나는이 디자인도 고려했다. 실제로이 질문을 게시 한 후 나는 처음 디자인을 으로 바 꾸었습니다. 사용자 (user_id) 메시지 (message_id, sender_id, receiver_id, message_content_id) Message_content (message_content_id, subject, body) 이 두 가지 디자인은 모두 첫 번째 (공간 및 테이블 성능에서). 질문 문은 다음과 같이되어야합니다. 모든 메시지를 한 테이블에 저장하거나 두 메시지를 모두 복사하는 것이 더 좋을까요? 성능에 미치는 영향은 얼마나 중요합니까? –

    1

    일반적으로 데이터베이스 크기는별로 중요하지 않습니다. 속도가 훨씬 더 중요합니다.

    따라서 두 번째 옵션으로 유혹받을 것입니다. 언급 한 것처럼 메시지 삭제와 같은 작업이 훨씬 쉬워지며이 작업을 수행하는 가장 일반적인 방법이라고 확신합니다.

    관련 문제