별도의 테이블을 사용하여 온라인 사용자를 저장해야합니까, 아니면 Extant 회원 테이블에 추가 필드를 사용해야합니까?

StackOverflow https://stackoverflow.com/questions/1445617

  •  22-07-2019
  •  | 
  •  

문제

저는 사용자가 사회적으로 상호 작용할 수있는 온라인 시스템을 연구하고 있으며 물론 실제로 온라인 사용자를 식별하는 것이 중요합니다. HTTP가 Sationeless 인 것에 대해 알고 있으며 세션 사용에 대해 알고 있으므로 사용자의 마지막 활성 시간을 임의의 만료 시간과 비교하여이를 달성해야합니다.

나의 궁극적 인 질문은 다음과 같습니다. 기존 멤버 테이블에 일부 필드를 추가해야합니다 (last_active_time, is_user_online, hide_online_status, 등) 또는 별도의 테이블 로이 정보를 유지하는 것이 가장 좋습니까? 나의 초기 생각은 단순성을 위해 기존 테이블을 사용하는 것입니다. 복잡성 수준을 제외하고, 하나와 다른 것의 이점/단점은 무엇입니까?

도움이 되었습니까?

해결책

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

다른 팁

새 테이블을 만듭니다.

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

그러나 실제 이유는 물리적 디자인에 의한 것입니다. 첫째, 주어진 시간에 로그온 할 사용자 수는 총 사용자 수보다 훨씬 작아서 저장 요구 사항이 낮아질 수 있습니다. 저장소 요구 사항이 낮아지면 데이터베이스의 부하가 줄어들고 업데이트 할 블록이 적기 때문입니다.

이 데이터를 메인 테이블에 넣으면 해당 블록이 훨씬 더 넓은 공간에 흩어져 있으며 데이터를 변경할 때 블록의 내용이 지속적으로 증가하고 줄어 듭니다.

그리고 마지막으로, 예를 들어 누가 온라인 상태인지 확인하려면 몇 가지 인덱스가 필요할 것입니다. 그리고 이러한 색인은 (1) 더 많은 공간을 차지하고 (2) 디스크에 물리적으로 기록되어야하는 훨씬 더 흩어져있는 더러운 블록을 만들고 (3) 업데이트 경합 지점을 도입 할 것입니다.

나는 그것이 당신이 기대할 것으로 예상되는 수에 달려 있다고 생각합니다. 수천 명의 사용자 만 있으면 온라인 상태를 사용자 테이블에서 사용자의 속성으로 만듭니다. 그 이상이있을 경우 온라인 _users 테이블을 원하고 메인 사용자 테이블에 대한 외국 키와 함께 해당 정보를 유지할 것입니다. 위의 포스터에서 언급 한 혜택을 누르려면 온라인_users 테이블에서 비활성 사용자를 제거하기 위해 몇 시간마다 실행하는 작업을 원합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top