2010-04-06 4 views
1

환경 : 제이 보스, MySQL은, JPA, 최대 절전 모드아카이빙 전략과 데이터의 한계

우리의 웹 응용 프로그램 (~ 1,000,000) 사용자의 많은 양의 음식됩니다

와 자식 테이블 곳의 제비가있다 사용자 특정 데이터 (예 : 개인, 건강, 포럼 기고 등)가 저장됩니다.

  1. 아카이브 사용자 & 사용자 특정 정보에 대한 가장 좋은 방법이 될 것입니다 무엇. [a] 보관 된 사용자 & 사용자 별 정보를 동일한 데이터베이스 내의 해당 테이블 (예 : user_archive, user_forum_comments_archive ...)로 이동하는 것이 현명한 방법입니까 아니면 [b] 데이터베이스 항목을 원본 테이블 (들)은 단지 아카이브되지 않은 항목 만 쿼리합니다.

  2. 우리는 User.loginid에 고유 한 제한 사항이 있습니다. 사용자가 1 - [a]를 통해 아카이브 된 경우 (예 : loginid 'samuel'을 가진 사용자가 아카이브 테이블로 이동 한 경우, 새 사용자가 원본 테이블에 같은 이름으로 추가되면 어떻게 방지 할 수 있습니까? 고유 한 키 제약 조건을 해결하는 가장 좋은 전략은 무엇이 될까요? 필요한 경우 JPA 엔티티 모델에 의해 노출 된 지속성 API를 통해 데이터베이스 도구에 의존 할 것입니까?

+0

우선, 아카이브 된 데이터에서 수행 할 수있는 작업은 무엇입니까? 포인트 2와 3을 제외하고, 예를 들어 포럼에 몇 개의 항목을 작성한 후 나중에 기여를 중지하고 "아카이브 된"이라고 가정 해 봅시다. 활동중인 사용자가 내 기여도를 볼 수 있습니까? 또는 아카이브도 가져올 수 있습니까? 그렇다면 누군가가 포럼을 통해 어떤 데이터에 액세스 할 수 있습니까 (공개 프로필이 계속 표시됩니까?). "다시 활동하는"사람들에게 어떤 정책이 있습니까? 활성 사용자 대 비활성 사용자의 비율은 어느 정도입니까? –

+0

포럼이 아직 많은 게시물을 보유하고 있기 때문에 포럼 기여가 표시되어야한다고 생각합니다 (특정 사용자에 대한 포럼 주석의 보관으로 인해 대화가 완전히 쓸모 없게 될 수 있습니다).사용자의 공개 프로필을 보관중인 다른 사용자에게 표시 할 필요는 없습니다. 시스템에서 사용하지 않는 사용자를 시스템에 보관하는 것이 좋습니다 (시스템의 총 사용자 수의 10 %). 다시 말하면,이 문제에 대한 올바른 접근 방법에 대한 아이디어를 찾고있을 뿐이며, 테이블 크기를 가능한 작게 유지하여 활성 사용자가 쿼리를 더 빨리 수행 할 수 있도록하려는 것입니다. – Sam

+0

당신이 1,000,000 명의 사용자를 확보 할 계획이라면 'samuel'과 같은 사용자 이름이 아닌 자동 생성/식별 숫자 PK를 사용하시기 바랍니다. 해당 문자열을 모든 곳으로 드래그하여 색인 성능을 저하시킵니다. –

답변

2

개인적으로, 나는 해결책 "[a]"에 갈 것입니다.

갖는 일이 일반적인 RDBMS 개념의 용어 (예에서 관리 할 일이 조금 열심히 할 것 (현재 및 보관)이 개 테이블 세트에 분할 : 포럼 코멘트 작성자가 사용자의 테이블에 대한 외래 키를 가리키는 것입니다 ...하지만 필드가 두 개의 다른 테이블에 대한 외래 키로 작동하도록 할 수는 없습니다).

사용자 테이블은 솔루션 "a"를 사용하고 프로필과 같은 다른 모든 테이블은 솔루션 "b"와 같이 쌍둥이 테이블에 보관됩니다. 그러나 이것은 코드에서 불필요하게 복잡해질 수 있습니다. 어떤 경우에는 아카이브되지 않은 것을보고, 어떤 경우에는 아카이브 된 경우에만, 다른 경우에는 둘의 조합으로보아야합니다.)

솔루션 A는 # 2 및 # 3 요구 사항도 쉽게 해결할 수 있습니다. 사용자 이름의 고유성은 모든 것이 동일한 테이블에 있고, 보관 된 사용자를 복원하는 것이 주 사용자 테이블에서 비트 (Archived = Y/N)를 뒤집어 쓴 경우에 적용하기 쉽습니다.

10 %는 그리 높지 않지만 성능면에서의 차이가 추가 복잡성 (및 버그 위험)을 실제로 정당화 할 수 있을지는 의문입니다.

+0

합병증을 피하기 위해 1- [a] 대신 1- [b]를 사용 하시겠습니까? – Sam

+0

예. SQL 최적화 프로그램이 아카이브 된 사용자를 신속하게 트리밍 할 수 있도록 (필요하지 않을 때) 인덱스를 Archived 플래그에 두십시오. –

1

나는 테이블에 보관 된 플래그를 넣은 다음 보관 된 레코드를보고 싶지 않을 때 사용할보기를 만듭니다. 그런 식으로 사람들은 내가 의심하는 아카이브 플래그를 적용 할 때 일관성을 유지하게 될 것입니다.