데이터베이스에 채팅 메시지를 저장하는 가장 좋은 방법은 무엇입니까? [닫은]


82

저는 채팅 앱을 만들고 있으며 채팅 대화에서 보낸 모든 메시지의 전체 기록을 원합니다. 지금은 '메시지'라는 테이블에 각 메시지를 단일 행으로 저장하고 있습니다. 'Hi'와 같은 작은 메시지도 자체 데이터베이스 레코드를 가지므로이 테이블이 커질 수 있다는 것을 알고 있습니다.

누구든지 더 확장 가능한 mysql 솔루션을 추천 할 수 있습니까? 개별 메시지를 검색, 편집 또는 삭제할 필요가 없습니다. 전체 대화를 하나의 거대한 필드에 저장할 수 있습니까?

당신의 아이디어를 듣고 싶습니다!


12
이러한 메시지는 검색 또는 편집 할 필요가없는 경우, 데이터베이스 내에서 유지하기 위해 아무 소용이 없습니다
ajreal

20
쉽게 시작하고, 간단하게 생각하고, 관계형 데이터베이스를 사용하고, 확장이 문제가되면 처리하는 것이 좋습니다! 너무 많은 사람들이 완벽한 인프라를 구축하는 데 너무 많은 시간을 소비하고 중요한 것에 집중할 시간이 없기 때문에 결코 발생하지 않을 시나리오에 관심을 갖습니다.
whirlwin

답변:


47

데이터베이스에 전체 히스토리를 저장하는 데 아무런 문제가 없습니다. 그들은 그런 종류의 작업을 위해 준비되어 있습니다.

사실 당신은 스택 오버플로 여기에 채팅에 대한 예제 스키마에 대한 링크를 찾을 수 있습니다 : 예를

여전히 크기에 대해 걱정이되는 경우 일정 시간 (예 : 1 분 정도) 후에 만 ​​푸시하는 버퍼를 애플리케이션에 추가하는 등 그룹 메시지에 몇 가지 최적화를 적용 할 수 있습니다. 이렇게하면 한 줄 메시지 만 피할 수 있습니다.


15

단일 파일에 대한 동시 쓰기의 필요성을 피할 수 있다면 채팅 메시지를 저장하는 데 데이터베이스가 필요하지 않은 것 같습니다.

대화를 텍스트 파일에 추가하기 만하면됩니다 (사용자 \ 대화 당 파일 1 개). 디렉토리 / 파일 구조가 있습니다.

다음은 파일 구조의 단순화 된보기입니다.

chat-1-bob.txt
        201101011029, hi
        201101011030, fine thanks.

chat-1-jen.txt
        201101011030, how are you?
        201101011035, have you spoken to bill recently?

chat-2-bob.txt
        201101021200, hi
        201101021222, about 12:22
chat-2-bill.txt
        201101021201, Hey Bob,
        201101021203, what time do you call this?

그런 다음 사용자 ID, 대화 ID (guid?) 및 파일 이름에 대한 참조 만 저장하면됩니다.

더 간단한 확장 가능한 솔루션을 얻는 것이 어려울 것이라고 생각합니다.

LOAD_FILE데이터를 가져 오는 데 사용할 수도 있습니다 . http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

대화를 다시 작성해야하는 경우 파일을 병합하고 정렬 할 수 있도록 전송 된 채팅 메시지 (파일에)와 함께 값 (날짜 시간)을 입력해야하지만이 시점에서는 아마도 좋은 생각 일 것입니다. 데이터베이스 사용을 고려하십시오.


1
이것은 훌륭하게 들립니다. 누구든지이 논쟁에 반대 할 수 있습니까?
여행

75
파일에 쓰는 것은 끔찍한 생각입니다. 대부분의 서버 측 환경 또는 클러스터에서 두 번째 요청이 파일과 동일한 서버에서 끝났다는 것을 보장 할 수도 없습니다. 파일 시스템 작성은 매우 느리고 I / O 바운드입니다. 죄송합니다. 이렇게 많은 찬성표를 받았다 니 믿을 수 없습니다.
Andy Fusniak

6
허구의 시나리오를 구성하지 않는 질문에 실제로 대답하고 있었어요. 현재 메시지는 데이터베이스에 유지되므로 간단한 파일 시스템 쓰기가 훨씬 느린 이유는 무엇입니까? 또한 사용자 \ 대화 당 내 대답 1 파일을 읽으십시오 !!! (가상 클러스터에 FSA-SAN을 설치했습니다) OPs 요구 사항은 파일에 속한 내 마음에 로깅 \ 감사와 같습니다.
Kevin Burton

5
파일 쓰기 및 읽기는 리소스를 많이 사용합니다. 모든 종류의 데이터베이스를 사용하면 리소스 지연을 줄이는 데 도움이 될 것이라고 생각합니다. 하루가 끝나면 데이터베이스는 이러한 정보를 파일에 저장합니다 (약간 다르게). 주어진 아이디어는 보관 된 채팅 또는 1 년 이상 된 채팅을 저장하는 데 환상적이라고 생각합니다. 그러나 여기에서 간단한 db를 능가하는 것은 없습니다.
Jay Patel-PayPal

3
영업 이익은 명확하게 떨어져이 끔찍한 생각에서이 질문에 대답하지, 데이터베이스 말한다
Lyoneel

2

이러한 대화의 모든 메시지를 포함하는 x 대화에 대한 데이터베이스를 만들 수 있습니다. 이렇게하면 x가 초과 될 때마다 새 데이터베이스 (또는 서버)를 추가 할 수 있습니다. X는 인프라가 지원하는 대화 수입니다 (하드웨어에 따라 다름).

문제는 여전히 동일한 데이터베이스에 큰 대화 (많은 메시지 포함)가있을 수 있다는 것입니다. 예를 들어 데이터베이스 A와 데이터베이스 B가 있고 각각 1000 개의 대화를 저장합니다. 서버 B보다 서버 A에 훨씬 더 많은 "큰"대화가있을 수 있습니다 (사용자가 만든 콘텐츠이므로). 데이터베이스 / 서버에서 단일 대화를 찾을 수있는 조회를 포함하는 "마스터"데이터베이스를 추가 할 수 있습니다 (또는 해시 / 모듈로 등에서 데이터베이스를 할당하는 스키마가 있음).

동일한 문제를 처리하고 (첫 번째가 아닐 수도 있음) 이미 해결 된 실제 아키텍처를 찾을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.