2011-08-10 4 views
7

PHP, MySQL, Apache를 기반으로하는 프로젝트에서 작업하고 있습니다.MySQL에서 데이터를 가져 오는 데있어 한 가지 방법을 선택하는 복잡성

나는 이것을 위해 나는 3 가지 방법

중 하나 I 알림을 필요로하는 사용자의 수에, 테이블에 모든 업데이 트를 삽입이 바로 페이스 북에서 사용할 수있는 알림 같다 통지라는 모듈이 이 업데이 트에 대한 즉 범주 B에 몇 가지 업데이 트가 있고이 범주 B가 100 명의 사용자를 포함한다고 가정하면 각 사용자에 대해 알림 테이블에 100 개의 행을 삽입합니다.

두번째 방법

난 그냥 테이블에서 특정 카테고리 항목을 삽입 한 다음 레코드를 가져 오기 위해 여러 테이블의 모든 레코드를 가져 오기 위해이 caregory ID 각각에 무거운 가입 쿼리를 파일 할 수

. 이 사용자를 통지 사용할 수 있도록

는 3 웨이

나는 모든 그 갱신에 트리거를 사용합니다.

나는 세 가지 방법 모두 어느 시점에서 문제가 있다고 생각합니다.

이제 더 좋은 아이디어를 제안하거나 더 좋은 옵션을 제안 할 수 있습니까? 그것은 대량 항목

감사

을해야합니다으로

나는 사이트의 성능에 대한 걱정

+0

카테고리와 사용자의 일대일 또는 다 대다 관계가 있습니까? –

+0

@OcCajnires Many to Many –

+1

당신이 발행 할'공통 쿼리'와'스키마'를 추가 할 수 있습니까? 일반적인 쿼리의 의미는 다음과 같습니다. 1.이 알림을 보내야하는 모든 사용자를 찾습니다. 2. 사용자에 대해 '보류 중'알림을 찾습니다. 3. 사용자의 '알림'알림을 찾습니다. 이것은 당신이하려고하는 것에 대한 더 나은 아이디어를 제공 할 것입니다. 일괄 항목을 말할 때 사용자 수를 의미합니까? 감사. –

답변

0

이는 약간 난이도이었다 내가 먼저

: 생각하는 방법 응용 프로그램/사용자 행동입니다 ? 우리는 언제 일을해야합니까? 데이터를 삽입 할 때 또는 데이터를 가져올 때입니까?

가장 일반적인 작업이 무엇인지 가정해야합니다. 나는 많은 사용자가 읽지 않은 메시지에 대한 통보를 보게 될 것이기 때문에 데이터를 가져 오는 것이 좀 더 일반적 일 것이라고 추측 하겠지만, 새로운 메시지 하나만 '삽입'할까?

따라서 새로운 공지 사항을 삽입하는 작업을 수행 할 예정이지만 사용자가 앱에 몰려들 때 계속해서 심하게 될 수도 있습니다.

하지만 최적화하기 전에 모델을 설정해야한다고 생각합니다. 더 중요합니다. 최적화는 나중에 denormalisation을 사용하여 스케줄링 등을 관리 할 수 ​​있습니다. 트리거를 만지지는 않을 것입니다. 조금 펑키 한 IMHO입니다.

나는 또 다른 접근법을 만들 것이다.

사용자가 새 메시지 기록 :

  • 삽입 메시지
  • 업데이트 user_category ')를 NOW ('

    UPDATE user_category SET는 = last_changed 그 시간에 업데이트되는 카테고리 (많은이 있습니다) 여기서 category_id =?;

사용자에게 읽지 않은 메시지 찾는 방법 : (? 더러운) 마지막으로 사용자가 그것을보고 이후 업데이트되었습니다

  • 카테고리를 선택합니다.
  • 'user_message_noticed'에없는 범주의 모든 메시지를 선택하십시오 (아래 참조). 사용자에

이 user_message_noticed A *에 메시지를

  • 삽입 행을 읽기 * 그 부부 메시지와 사용자 스키마. 카테고리 ID가 있으므로 추가 조인없이 위의 작업을보다 빠르게 수행 할 수 있습니다. 해당 범주 에서 읽은 모든 메시지에

- 사용자가 모든 메시지를 읽을했을 때 업데이트 * user_category의 ™는 날짜 (많은 많은있다).

하지만 때로는 실제 작업을 수행하지 못하는 경우가 있습니다.

0

MySQL에서 방아쇠를 지원하는 것은 좋지 않으므로 그렇게하는 것이 좋은 방법 일 수는 있겠지만 나는 그 방향으로 나아 가지 않을 것입니다.

가장 간단한 방법은 다음과 같습니다. 로그인/로그 아웃 할 때마다 "온라인 사용자".id에서 사용자를 삽입/삭제하고 프런트 엔드 (어쨌든 할 일이 있습니다.) 지금 물어보고 그가 알고있는 이드 중 어느 것이 테이블에 있는지 알고 있는지 확인하십시오.

MySQL에서는 비교적 똑똑하지 않지만 조인은 인덱스가있는 경우에도 큰 테이블에서 느려집니다.

방아쇠를 당기고 똑같은 다음 방아쇠를 당기려면 무엇을 하시겠습니까 ?? 이 사람이 로그인 한 모든 것을 푸시? 관심있는 사람들을 밀어 붙이려고? 이것은 또 다른 조인 즉 성능 저하를 의미합니다.

알림 테이블? 아무 이유없이 완전히 거대하고 느립니다 (즉, 쿼리 대신 meh).

관련 문제