2009-06-22 4 views
2

PHP + MySQL 개발과 관련된 거의 모든 특정 질문에 대한 답변을 찾을 수 있지만 찾지 못한 리소스는 고급 문제 해결 방법입니다.고급 웹 개발 자습서

AJAX에서 쿼리 할 수있는 작은 메시지 보드 유형 시스템을 구현하고 싶지만 미리 작성된 라이브러리로 채울 수있는 사양이 너무 많습니다. 구현 방법 및 튜토리얼이 필요하지 않습니다. 데이터베이스를 사용하십시오.

내가 찾고있는 것은 고급 사용자에게 "메시지 저장 및 마지막 10 개 메시지 인쇄"스타일 자습서보다 복잡한 문제에 대한 좋은 해결책을 제공하는 리소스입니다.

예 : 내 웹 사이트에는 여러 개의 사용자가있는 그룹 페이지가 있고 개인 그룹 페이지에는 작은 "벽"모양의 게시판이 있습니다. 이 특정 테이블을 디자인 할 때는 무엇을 고려해야합니까? 잠금은 어떻게 구현해야합니까? 등

물론 내 개인적인 문제에 대한 튜토리얼이있을 것으로 기대하지는 않지만 이해할 수있는 DB 중심 웹 사이트에 대한 완벽한 해결책을 원합니다 (WordPress와는 달리 - 너무 조금 퍼짐) 실제로 실제로 작동합니다 (참조 서의 뒷부분에서 찾을 수있는 전체 솔루션과 달리).

답변

3

나는 일반인으로 남아 있기 때문에 .net 남자 야. 내 해결책이야. 나는 당신이 필요로하는 해결책이 언어에 특정한 방법이라고는 생각하지 않는다. 살펴볼 필요가있는 것은 디자인 패턴과 특정 작업을 수행하는 엔터프라이즈 방식입니다. 성공을위한 열쇠는 데이터베이스 구현을 통해 (전체적으로) 오지는 않지만 데이터를 사용하는 방법과 용도. 확장하려면 db 대신 큐에 쓰고 신속하게 (db 대신 가능하면 캐시 계층에서 읽음) 신속하게 검색하고 (db 대신 Lucene 인덱스에서 검색) 신속하게 작성할 수 있어야합니다). 많은 사람들이 DB에 매달려 있고 일반적으로 그렇게하고 있습니다. 응용 프로그램 데이터 저장소 및 쿼리의 핵심 부분입니다. 그러나 그것은 또한 일반적으로 모든 시스템에서 가장 큰 단일 병목 중 하나입니다. 물론, 모든 데이터를 db에 저장하십시오. 직접하지 마십시오. 물론, db에서 데이터를 읽고 쿼리하십시오.하지만 절대적으로 필요한 경우에만 (인덱스를 사용하여 데이터를 찾은 다음 데이터베이스에서 데이터를 읽습니다).

애플리케이션이 외부 서비스와 대화 할 때도 마찬가지입니다. 예를 들어 이메일을 보내십시오. SMTP 서버에 연결하고 전자 메일을 패키징하여 보내는 것으로 전자 메일을 보내지 말고 메시지를 대기열에 넣고 SMTP를 통해 전자 메일에 연결하고 보내는 큐 리더를 만듭니다. 이렇게하면 웹 앱이 계속 원활하게 실행됩니다.

성공의 열쇠는 성능 지향적 인 연구와 훌륭한 건축 설계입니다. 도메인 구동 디자인, 컨트롤 반전, 테스트 주도 개발, 저장소 패턴, 모델보기 컨트롤러, memcached, 속도, 대기열, MSMQ, 데이터베이스 메일 대기열 등을 검색하십시오.

+0

훌륭한 반응, 아이디어에 감사드립니다. 제공된 대기열과 캐시가 더 원활하게 실행되고 병목 현상이 줄어들도록하기 위해 제공된 대기열과 캐시의 문제점을 이해합니다.하지만 기본 주 언어가 PHP이므로 기본적으로 비동기입니다. 대기열을 처리하는 일종의 서버 측 데몬을 작성하라고 제안하고 있습니까? 나는 그 일을 할 수는 있지만 그건 내 생산 속도를 저해 할 것이다. 일단 프로젝트가 시작된 후에도이를 구현할 수있을 정도로 충분히 추상적 일을 만들 수 있습니다. –

+0

모든 것이 충분한 추상화로 프로그래밍되면 언제든지 새로운 기능 레이어를 "삽입"할 수 있어야합니다! 비동기 적으로 모든 작업을 수행한다면이 문제가 "문제가 아닙니다." 그러나, 그러나 ... 어떻게 비동기 방식으로 읽습니까? 페이지가 열리거나 그렇지 않을 때 데이터가 존재합니다! {GRIN} 대기열을 통해 전자 메일을 보내는 것이 가장 좋습니다. 각 삽입을 db에 대기시킨 다음 db에 대용량 쓰기를 수행하는 것이 일반적으로 더 빠릅니다. 나는 PHP가 오프라인 큐의 어떤 형태를 가지고 있다고 확신한다 ... 나는 단지 그것을 모른다. –

3

당신이 언급 한 모든 것들 (아마도 "고급 이슈")은 모두 사려 깊은 방식으로 함께 만들어진 다소 간단한 접근법과 기술입니다.

여러 사용자가 동시에 편집하지 못하도록 테이블을 잠그는 것은 다소 간단한 문제입니다. issue of locking has been addressed 여기에 여러 번 있습니다.

회원을 그룹에 지정하는 것은 몇 가지 테이블 간의 일대 다 관계에 불과합니다. 사용자 테이블, 그룹 테이블 및 사용자 - 그룹 테이블이 있습니다. 사용자가 여러 그룹에 속할 수 있다고 가정합니다.

검색어에 몇 가지 작은 조인을 추가하면 다양한 사용자의 특정 그룹에 대한 게시물을 얻을 수 있으므로 그룹 별 게시판을 채울 수 있습니다. 또한 해당 게시판을 읽으려면 해당 그룹에 사용자가 있는지 확인하여 해당 게시판을 민영화 할 수 있습니다. 이는 해당 GroupID와 함께 해당 UserID가 있는지 확인하기위한 Users-to-Groups 표의 빠른 쿼리 일뿐입니다.

+0

그리고 나는 그것을 깨닫지 만, m 결합 접근법을 사용하면 가능성이 기하 급수적으로 늘어납니다. 나는 사려 깊을 수는 있지만 항상 올바른 결정을 내릴 수있는 충분한 경험이 없으며, 내가 올바른 결정을 내릴 때 제공 할 수있는 디자인의 안정성과 품질을 요구하는 애플리케이션을 만들고 있습니다. 자원을 찾고 있어요. 그리고 run-on 문장에 대해 유감스럽게 생각합니다! 또한 귀하의 링크가 이상하게 번역되었습니다. % 20s -> + Google에서 다시 변경해야합니다. 당신이 그것을 고칠 필요가 있는지 모른다. –

+0

죄송합니다. 이제 링크가 작동합니다. – Sampson

+0

아, 동시 편집 - 미안하다 조나단 :) –