2011-09-14 2 views
5

시나리오 : 한 번에 여러 명의 사용자가 채팅 할 수 있도록 채팅방을 디자인하십시오. 모든 채팅 내용을 저장해야합니다. 사용자가 로그인 할 때마다 그는 모든 이전 채팅을 볼 수 있어야합니다. 적절한 순서 채팅 입수대화방을위한 데이터베이스 디자인. 모든 채팅 내용을 저장해야합니다.

CREATE TABLE chat 
(
    chat_id int NOT NULL auto_increment, 
    posted_on datetime NOT NULL, 
    userid int NOT NULL, 
    message text NOT NULL, 
    PRIMARY KEY (chat_id), 
    FOREIGN KEY(userid) references users(userid) on update cascade on delete cascade 
); 

, 나 I가 채팅을 기억하고있는 테이블의 일부 기본 키가 필요

여기에 채팅을 저장하는 데 사용할 수있는 테이블의 일 예이다. 그래서 위의 표를 사용하여 채팅을 저장하면 2147483647 개 이상의 채팅을 저장할 수 없습니다. 분명히, 나는 unsigned bigint와 같은 거대한 범위를 가진 어떤 데이터 형을 사용할 수 있지만, 여전히 약간의 제한이있을 것이다.

시나리오에 따르면 저장해야 할 채팅이 무한 할 수 있으므로 어떤 테이블을 만들어야합니까? 다른 기본 키를 만들어야합니까?

솔루션을 분류하는 데 도움을주십시오. 구글이나 페이스 북이 어떻게 모든 채팅을 저장할 수 있는지 궁금합니다.

+1

bigint의 문제점은 무엇입니까? 최대 9223372036854775807 개의 고유 한 인스턴스 범위를 제공합니다. 하루에 10 억 개의 채팅이 있다면, 그 범위를 초과하기까지 90 억 년이 걸릴 것입니다. – selbie

+0

하지만 커다란 테이블을 가지고 있으면 퍼포먼스 단점이라고 생각합니다. – Paddy

+0

@selbie 누군가가 테이블이 너무 커지면 테이블의 데이터를 파일로 덤프하고 테이블을 비우고 그 데이터가 필요할 때 파일의 데이터를 테이블로로드해야한다고 말했습니다. 이것이 Google 또는 fb가 무한 데이터를 저장하는 방법입니다. 그러나 이것이 올바른 해결책인지 또는 올바른지 정확히 알지 못한다. – Paddy

답변

0

MySQL을 사용하지 않는 경우 사용자 ID와 타임 스탬프의 기본 키가 정상적으로 작동합니다. 하지만 MySQL의 타임 스탬프는 1 초로 만 해결됩니다. (이 답변에 영향을주는 최근 변경 사항은 아래를 참조하십시오.)이를 해결할 수있는 몇 가지 방법이 있습니다.

  • 하자 응용 프로그램 코드는 다음, 초를 기다리고 다시 제출하여 기본 키 위반을 처리합니다.
  • 응용 프로그램 코드가 고정밀 타임 스탬프를 제공하도록하고 을 '2011-01-01 03 : 45 : 46.987'과 같이 정렬 가능한 CHAR (n)로 저장하십시오.
  • 마이크로 초 타임 스탬프를 지원하는 dbms로 전환하십시오.

시간 소인순으로 정렬 된 행을 표시하는 쿼리를 작성하려면 응용 프로그램 코드가 서버 측 코드 여야합니다.

나중에

의 MySQL의 현재 버전은 fractional seconds in timestamps을 지원합니다.

+0

MariaDB 5.3 (아직 베타)은 datetime 및 timestamp 유형의 마이크로 초를 지원합니다. http://kb.askmonty.org/en/microseconds-in-mariadb –

+0

사용자 ID와 같은 비 순차 값으로 키를 시작하면 데이터가 발생합니다 서로 다른 지점에서 테이블에 무작위로 삽입됩니다. 새 데이터를 테이블 끝에 추가하는 것이 가장 좋습니다. 특히 인덱스에 도움이됩니다. –