2009-09-18 1 views
1

나는 사회적으로 상호 작용할 수있는 온라인 시스템을 개발하고 있으며 실제로 온라인에있는 사용자를 식별하는 것이 중요합니다. 나는 HTTP에 대해 무국적이며 세션 사용에 대해 알고 있으므로 사용자의 마지막 활성 시간을 임의 만료 시간과 비교하여이를 수행해야합니다.온라인 사용자를 저장하기 위해 별도의 테이블을 사용해야합니까, 아니면 현존 멤버 테이블에 추가 필드를 사용해야합니까?

내 궁극적 인 질문이 아래로 온다 : 난 그냥 기존 회원 테이블에 일부 필드를 추가해야합니다 (last_active_time, is_user_online, hide_online_status 등) 또는 그것을 별도의 테이블에이 정보를 유지하는 가장 좋은 것입니다? 필자의 초기 생각은 단순화를 위해 기존 테이블을 사용하는 것입니다. 복잡성의 수준을 제외하면, 하나의 장점과 단점은 무엇입니까?

답변

1

나는 이것을 별도의 테이블에 유지할 것이다. 백만 명의 사용자가 있고 누가 온라인 상태인지 알고 싶다면 해당 테이블을 반복해서 스캔하여 해당 정보를 찾을 수 없습니다. 귀하의 "온라인"테이블은 비교적 작을 것이며 지난 5 분 이내에 오지 않은 사람들을 위해 정기적으로 스캔 한 다음 온라인 테이블에서 삭제하고 회원 테이블에서 필요한 것을 모두 업데이트하는 작업을 할 수 있습니다 "last_seen"

2

새 테이블을 만듭니다.

첫째, 철학적 인 이유가 있습니다. 하나의 목적 (읽기 : 표)이 하나의 목적을 가져야한다는 철학적 인 이유가 있습니다. 그럼에도 불구하고 데이터베이스 논리적 디자인에서는 많은 부분이 흐려 지지만 좋은 원칙입니다.

실제 이유는 물리적 디자인 때문입니다. 첫째, 주어진 시간에 로그온 할 사용자 수가 전체 사용자 수보다 훨씬 적으므로 저장소 요구 사항이 낮아질 수 있습니다. 또한 읽기 및 업데이트 할 블록 수가 적기 때문에 스토리지 요구 사항을 줄이면 데이터베이스의로드가 줄어 듭니다.

메인 테이블에이 데이터를 넣으면 훨씬 더 넓은 공간에 블록이 흩어져서 데이터를 변경하면 블록의 내용이 계속 커지고 줄어 듭니다.

마지막으로, 현재 온라인 상태 인 사람을 확인하기 위해 일부 색인이 필요할 수 있습니다. 그리고 그 색인은 (1) 더 많은 공간을 차지합니다. (2) 더 많은 흩어져있는 더티 블록을 물리적으로 디스크에 작성해야합니다. (3) 업데이트 경합 지점을 도입합니다.

0

나는 그것이 얼마나 많은 사용자를 가질 것으로 예상하는지에 달려 있다고 생각합니다. 몇 천 명의 사용자 만있을 경우 온라인 상태를 사용자 테이블의 사용자 속성으로 지정합니다. 그 이상이 될 경우에는 online_users 테이블이 필요하며 기본 사용자 테이블에 외래 키를 사용하여 해당 정보를 보관하십시오. 위의 포스터에서 언급 한 이점을 얻으려면 온라인 사용자 테이블에서 비활성 사용자를 제거하는 작업을 몇 시간마다 실행해야합니다.

관련 문제