별도의 테이블을 사용하여 온라인 사용자를 저장해야합니까, 아니면 Extant 회원 테이블에 추가 필드를 사용해야합니까?
문제
저는 사용자가 사회적으로 상호 작용할 수있는 온라인 시스템을 연구하고 있으며 물론 실제로 온라인 사용자를 식별하는 것이 중요합니다. HTTP가 Sationeless 인 것에 대해 알고 있으며 세션 사용에 대해 알고 있으므로 사용자의 마지막 활성 시간을 임의의 만료 시간과 비교하여이를 달성해야합니다.
나의 궁극적 인 질문은 다음과 같습니다. 기존 멤버 테이블에 일부 필드를 추가해야합니다 (last_active_time
, is_user_online
, hide_online_status
, 등) 또는 별도의 테이블 로이 정보를 유지하는 것이 가장 좋습니까? 나의 초기 생각은 단순성을 위해 기존 테이블을 사용하는 것입니다. 복잡성 수준을 제외하고, 하나와 다른 것의 이점/단점은 무엇입니까?
해결책
나는 이것을 별도의 테이블 내에서 유지할 것입니다. 백만 명의 사용자가 있고 온라인 상태인지 알고 싶다면 해당 정보를 찾기 위해 그 테이블을 반복해서 스캔하고 싶지 않습니다. "온라인"테이블은 상대적으로 작으며 지난 5 분 정도 안에 들어오지 않은 사람들을 위해 주기적으로 스캔 한 다음 온라인 테이블에서 삭제하고 회원 테이블에서 필요한 모든 것을 업데이트하는 작업을 수행 할 수 있습니다. "last_seen"의 경우
다른 팁
새 테이블을 만듭니다.
첫째, 철학적 이유가 있습니다. 즉, 하나의 대상 (읽기 : 테이블)이 하나의 목적을 가져야한다는 것입니다. 그것은 데이터베이스 논리 디자인에서 많은 흐름이 발생하지만 그럼에도 불구하고 좋은 원칙입니다.
그러나 실제 이유는 물리적 디자인에 의한 것입니다. 첫째, 주어진 시간에 로그온 할 사용자 수는 총 사용자 수보다 훨씬 작아서 저장 요구 사항이 낮아질 수 있습니다. 저장소 요구 사항이 낮아지면 데이터베이스의 부하가 줄어들고 업데이트 할 블록이 적기 때문입니다.
이 데이터를 메인 테이블에 넣으면 해당 블록이 훨씬 더 넓은 공간에 흩어져 있으며 데이터를 변경할 때 블록의 내용이 지속적으로 증가하고 줄어 듭니다.
그리고 마지막으로, 예를 들어 누가 온라인 상태인지 확인하려면 몇 가지 인덱스가 필요할 것입니다. 그리고 이러한 색인은 (1) 더 많은 공간을 차지하고 (2) 디스크에 물리적으로 기록되어야하는 훨씬 더 흩어져있는 더러운 블록을 만들고 (3) 업데이트 경합 지점을 도입 할 것입니다.
나는 그것이 당신이 기대할 것으로 예상되는 수에 달려 있다고 생각합니다. 수천 명의 사용자 만 있으면 온라인 상태를 사용자 테이블에서 사용자의 속성으로 만듭니다. 그 이상이있을 경우 온라인 _users 테이블을 원하고 메인 사용자 테이블에 대한 외국 키와 함께 해당 정보를 유지할 것입니다. 위의 포스터에서 언급 한 혜택을 누르려면 온라인_users 테이블에서 비활성 사용자를 제거하기 위해 몇 시간마다 실행하는 작업을 원합니다.