2012-07-13 1 views
0

나는 Coldfusion8와 MySQL 5.0.88Coldfusion과 데이터베이스를 다시 쿼리 할 때 활성 쿼리 결과 집합을 저장하고 액세스하는 것이 좋습니다. <strong>여러보기</strong> 및 <strong>단일보기</strong> :

제품 검색은 두 개의 디스플레이 모드가 있습니다를 사용하여 제품 검색 엔진을 가지고있다.

복수은 기본 레코드 정보를 표시합니다. 은 데이터베이스에서 추가 데이터를 폴링해야합니다.

는 현재 사용자가 검색을 수행하고 난 폴링 해요

에 대한 데이터베이스 (가) 전체 기록과
(b)는 TO에 FROM 기록.

내 생각은 (쓰레기가) 얻기 위해 데이터베이스를 다시 쿼리가 기록과의 전체 수를 각 사용자의 현재 결과 집합을 저장하지 않도록했다, 그래서 사용자는 항상 자신의 현재 결과 집합에서 단일보기로 이동 (낭비 b) 이전에 쿼리 한 단일 레코드 및 단일 뷰에 필요한 세부 정보 얻기

그러나 나는 여기에 아무 것도 없습니다.

각 사용자 (세션)마다 고유하므로 현재 결과 집합 쿼리를 캐시 할 수 없습니다.

CFC 내에서 CFINVOKED 메소드 내에서 쿼리가 실행 중입니다. AJAX를 통해 호출하므로 전체 쿼리가 실행되고 이후 CFC 및 CFINVOKE 메소드가 삭제되므로 쿼리 또는 variables.cfc_storage의 쿼리를 사용할 수 없습니다. .

그래서 내 생각은 모든 새로운 검색으로 업데이트 될 세션 범위에 현재 결과 집합을 저장하고 사용자가 실행합니다 (페이지 매김 또는 완전히 새로운 검색). 저장된 최대 결과는 표시된 결과 수입니다.

내가 사용, 무사 쿼리를 저장할 수 있습니다

:

<cfset Session.resultset = query_name> 

이 결과 전체 쿼리를 저장하므로 같은 : 이것은 사용자가 새로운 검색을 수행 할 때마다 덮어 쓸 것

query 
CACHED: false 
EXECUTIONTIME: 2031 
SQL: SELECT a.*, p.ek, p.vk, p.x, p.y 
    FROM arts a 
     LEFT JOIN p ON 
     ... 
     LEFT JOIN f ON 
     ... 
     WHERE a.aktiv = "ja" 
     AND 
     ... 20 conditions ... 

SQLPARAMETERS: [array] 
1) ... 20+ parameters 

RESULTSET: 
[Record # 1] 
    a: true 
    style: 402 
    price: 2.3 
    currency: CHF 
    ... 
[Record # 2] 
    a: true 
    style: 402abc 
    ... 

. 그러나 사용자가 이러한 항목 중 하나의 세부 정보를보고 싶다면 내 임시 저장소에서 필요한 레코드에 액세스 할 수 있으면 쿼리 할 필요가 없습니다 (총 레코드 수 &). 이 방법을 사용하면 이미 실행 한 데이터를 얻기 위해 실행 시간이 각각 인 두 번의 데이터베이스 여행을 절약 할 수 있습니다.

Session.scope에서 최대 48 개 결과 (페이지 당 최대 항목 수)의 결과 집합을 갖는 모든 사용자가 적합합니다.

내 질문 :
1.이 방법이 유용할까요, 아니면 데이터베이스를 다시 쿼리해야합니까?
2. 위와 같은 struture/array/object가있는 경우 스타일 번호로 필요한 레코드를 어떻게 선택합니까? 결과 세트에 어떻게 액세스합니까? 나는 저장된 쿼리를 반복 할 수 없다 (잠시 동안 이것을 시도했다 ...).

도움 주셔서 감사합니다.

답변

1

레코드 수에 따라 ID가 키인 구조로 응용 프로그램 범위에 저장된 세부 정보 데이터를 가져야합니다. 다음과 같이하십시오 :

APPLICATION.products[product_id].product_name 
           .product_price 
           .product_attribute 

그런 다음 필요에 따라 항목 ID를 쿼리하면됩니다.

"주문형"쿼리를 향상 시키려면 적어도 두 개의 "코드 내"옵션이 있어야합니다. 1. 전체 쿼리를 한 번 쿼리 한 다음 해당 쿼리에서 필요한 데이터. 2. Verity 또는 SOLR로 모든 것을 색인화 한 다음 검색 컬렉션을 새로 고칠 때 모든 것을 쿼리하면됩니다. 모든 쿼리에 대해 모든 조인을 수행하는 것보다 톤이 빠릅니다.

+0

저는 Verity와 Solr을 아직 보지 못했습니다 (아직). 데이터베이스를 통해 색인을 생성했기 때문에 기쁜 일입니다. 데이터를 응용 프로그램 범위에로드하려고하는지 잘 모르겠습니다. 너무 많은 레코드. 나는 그의 세션에서 최대 24 개의 레코드를 가진 모든 사용자를 생각하고있었습니다. "evoked set". 사용자가 검색을 수행하면 24 점이 저장됩니다. 새로운 검색 또는 페이지 매김은 24 점을 대체합니다. 세부 정보를 조회하면 24 점의 x가 사용되어 세부 정보보기를로드합니다. 이 구문을 사용하여 시도해 보겠습니다. 지금까지 고마워! – frequent

2

실현 가능? 그렇습니다. 얼마나 많은 사용자와 얼마나 많은 데이터가 메모리에 저장되는지에 따라 DB로 다시가는 것보다 훨씬 낫습니다.

원하는 단일 레코드를 얻는 가장 좋은 방법은 쿼리 쿼리입니다. CF에서 기존 쿼리를 데이터 소스로 사용하는 다른 쿼리를 생성 할 수 있습니다. 그것은 다음과 같이 보일 것이다 : 당신이 CFBuilder를 사용하는 경우, 그것은 아마 데이터 소스를 가지고 있지 주셔서에서 오류를 비명 것

<cfquery name="subQuery" dbtype="query"> 
    SELECT * 
    FROM Session.resultset 
    WHERE style = #SelectedStyleVariable# 
</cfquery> 

노트,이 CFBuilder에서 문제를, 당신은 데이터 소스의 경우를 할 필요가 없습니다 귀하의 DBType이 "쿼리"

+0

나는 QoQ를 사용해 보았지만, 내 초기 쿼리는 cfinvoke로 호출 된 함수 안에 있기 때문에 항상 scrath에서 시작하여 "cfinvoke와 함께"버려 졌기 때문에 이전 쿼리를 쿼리 할 수 ​​없습니다. 그래서 세션 범위 – frequent

3

KISS 규칙입니다. 성능이 실제로 문제가 아니라면 데이터베이스를 다시 쿼리하십시오. 올바른 색인을 사용하면 꽤 잘 조정됩니다. 문제가되면 간단히 쿼리 캐시를 추가 할 수 있습니다.

QoQ는 오버 헤드 (CF 측에 메모리 & 계산)를 도입하고 부실 데이터 (세션의 쿼리가 DB의 것보다 오래되는 경우)를 반환 할 수 있습니다. 같은 쿼리에서 동일한 쿼리를 사용하지만 세션 시간 범위 전체에서 사용하지 않는 경우에만 QoQ를 사용합니다.

+1

동의에 쿼리 결과를 저장하는 것에 대해 궁금해했습니다. 단일 쿼리가 실제로 성능 문제가 아닌 한 간단하게 유지하십시오. ID에 CF의 내장 쿼리 캐싱 및 매개 변수 바인딩 (cfqueryparam)을 사용하십시오. –

+0

저는 KISS를 좋아합니다 ... 지금은 다시 쿼리하고 있습니다 (그리고 레코드 쿼리의 총 수를 건너 뜁니다). 지금까지는 괜찮아요.하지만 검색어가 필요하지 않아야하지. – frequent