2009-11-16 3 views
2

나는 몇 가지 조언을 찾고 있습니다. 나는 최근에 내가 끔찍한 코드를 물려받은 프로젝트를 마무리했다. 응용 프로그램을 실행하고 있지만 고급 검색 기능과 같은 여러 가지 성능 및 디자인 문제가 있다고 말하는 것이 안전합니다. 나는 지금 매우 비슷한 프로젝트를 수행하도록 요청 받았지만 규모면에서 훨씬 더 큰 프로젝트를 수행하도록 요청 받았다. 여기서는 처음부터 훨씬 우수한 도메인 모델을 구축하고 훨씬 더 나은 응용 프로그램을 만들 수있는 기회를 얻었습니다. 문제는 고급 검색을 구현하는 가장 좋은 방법은 무엇입니까?고급 검색 대형 개체 디자인

고급 검색 페이지에는 2 개의 필수 텍스트 필드, 4 개의 선택 드롭 다운 목록 및 여러 개의 선택적인 확인란이있는 2 개의 개별 영역이있는 양식이 나타나 결과를 더욱 필터링합니다.

현재 솔루션은 두 개의 필수 필드를 사용하여 선택적 양식 값에 따라 필터링 및 제거하는 개체 목록을 반환합니다. 그런 다음 필터링 된 목록을 캐시에 던져 사용자의 세션 ID를 첨부합니다. 그런 다음 각 결과 페이지에서 Take(). Skip() 접근 방식을 사용하는 페이징 링크를 표시하는 Html.Helper가 캐시에서 검색된 List에서 10 개의 결과를 표시합니다.

내가 갖고있는 문제는 목록이 꽤 힘들 수 있다는 것입니다. 캐시에 넣음으로써 결과의 모든 새 페이지에 대한 데이터베이스 호출을 저장하려고하지만이 방법에 접근하는 것이 가장 좋은 방법인지 확신 할 수 없습니다. 모든 양식 값을 몬스터 쿼리 문자열에 넣고 GET 요청에서 데이터베이스 호출을 계속해야합니까? 데이터베이스 또는 세션에 사용자 검색 기준을 저장하고 결과가 새로 추가 될 때마다 사용해야합니까? 캐시를 사용하여 그와 같은 가벼운 컬렉션을 보유하고있는 것이 맞습니까?

저는 여기에 비슷한 질문을했습니다 : Paging search results with asp.net MVC로 캐시를 사용하게했습니다. 이제 깨끗한 슬레이트를 얻었으므로 모범 사례를 따르고 처음부터 올바르게 수행하고 싶습니다. 어떤 제안이라도 좋을 것입니다.

답변

1

분명히 고급 검색을 구현하는 가장 좋은 방법은 검색 공간의 크기 및 검색 빈도와 관련하여 귀하의 요구 사항과 현재 예상에 따라 다릅니다. 내 생각에 가장 큰 문제는 검색을 ORM의 일부로 또는 관계형 데이터베이스에 구현할지 여부입니다.

큰 SQL 쿼리는 상당히 느리고 조정하기가 어려우며 디버깅하기가 어려울 수 있습니다. 고급 검색이 주요 기능이고 복잡한 비즈니스 규칙이 많은 경우 검색을 ORM의 일부로 구현하는 것을 고려하십시오. 또한 지능형 검색은 ORM의 사용을 선호합니다.

많은 수의 대형 개체를 메모리에로드하면 성능과 확장 성이 모두 저하 될 수 있습니다. 검색 공간이 큰 경우 SQL을 사용하여 검색을 수행하십시오.

분산 검색에 사용할 수있는 알고리즘이 있지만 매우 정교하며 예산, 전문 기술 및 배달 일정이 이러한 접근 방식을 수용하지 못할 수 있습니다. 어떻게 전략적으로 프로젝트의 성공에 대한 검색이 전략적입니까?

검색이 실시간이어야합니까? 그렇지 않은 경우 오브젝트가 피크 시간이 아닌 시간에 인덱싱되는 하이브리드 방식을 고려하십시오. "the"또는 "because"와 같은 관련성이 낮은 단어를 검색해야하는 것은 낭비입니다. 따라서 대상의 어처구니없는 버전을 검색하면 행복한 매체가 될 수 있습니다.

행운을 빈다.

+0

의견을 보내 주셔서 감사합니다. 고급 검색 부분은 가장 중요하고 자주 사용되는 기능이므로 전체 프로젝트에 매우 전략적입니다. 당신은 SQL과 ORM이 검색과 필터링을하도록하는 것에 중점을 두었습니다 ...그래서 두 개의 필수 필드 값을 충족하는 모든 개체를 반환하는 내 디자인 및 선택적 양식 값을 나쁜 연습을 기반으로 C# 코드에서 해당 목록 필터링? –

+0

데이터 계층에서 일부 필터링을 수행하고 웹 계층에서 일부 필터링을 수행하려는 것 같습니다. 그게 맞습니까? 그것은 좋은 접근 일 수 있습니다. 이것이 커다란 개발 노력 인 것처럼 들리지는 않습니다. 왜 그 접근 방식으로 가지 않니? 나중에 문제가 발생하면 해당 코드를 다른 것으로 대체 할 수 있습니다. 대안의 연결을 쉽게 할 수 있도록 코드를 모듈화하십시오. – Glenn

+0

좋은 조언. 이러한 검색 결과를위한 페이징 시스템을 만드는 경우 모든 양식 값을 괴물 쿼리 문자열에 넣고 모든 페이징 요청에 대해 데이터베이스 호출 및 필터를 수행하거나 캐시 시스템을 사용하는 것이 좋습니다. –