문제

내 애플리케이션이 성장하면서 여러 웹페이지에서 많은 데이터베이스 쿼리를 재사용하고 있다는 사실을 알게 되었습니다.

지금은 많은 내용이 포함된 .CFM 파일을 사용하여 이 작업을 수행했습니다. <cfstoredproc> 데이터베이스 데이터가 필요한 모든 페이지에 포함되는 태그입니다.내가 하는 일은 이러한 저장 프로시저 실행을 다음과 같이 래핑하는 것뿐입니다. <cfif> 호출 페이지의 이름이 무엇인지 테스트한 다음 적절한 명령을 실행하는 태그 <cfstoredproc> 코드 블록.

나는 어떤 분야의 전문가도 아니지만 이것은 나에게 옳지 않다고 느낍니다.전체 웹사이트의 CFM 페이지에서 공유할 수 있도록 모든 데이터베이스 쿼리를 올바르게 관리하는 방법을 모르겠습니다.예를 들어 한 페이지에는 "GetUsers" 저장 프로시저가 필요할 수 있고 다른 페이지에는 "GetOrders"가 필요할 수 있습니다.

나는 이제 막 모든 개별 항목을 보유하는 CFC를 만드는 일에 착수하려고 합니다. <cfstoredproc> 또는 <cfquery> 자체적인 방법/함수로.예:

<cfcomponent name="DBQueries" hint="Everything for DB retrieval">
 <cffunction name="GetUsers" returntype="query">
   <cfstoredproc procedure="GetUsers">
   <cfprocresult name="rsUsers">
   </cfstoredproc>
   <cfreturn rsUsers>
 </cffunction>
.....
 <cffunction name="DBQuery100">
   <cfstoredproc procedure="GetSomething" returntype="query">
   <cfprocresult name="rsSomething">
   </cfstoredproc>
   <cfreturn rsSomething>
 </cffunction>
</cfcomponent>

그런 다음 기본 .CFM 페이지에서 데이터를 반환하는 데 필요한 구성 요소와 메서드를 호출합니다.이것이 DB 쿼리 관리를 달성하는 좋은 방법입니까?

도움이 되었습니까?

해결책

다음 두 개의 DB 테이블을 고려하십시오.

사용자

userId primarkKey firstName lastName입니다

보안

SecurityId PrimaryKey userId 외국 키 권한

모든 데이터베이스 테이블에는 생성, 읽기, 업데이트, 삭제 작업(CRUD)이 있습니다.

CRUD 작업은 여러 위치에 존재할 수 있습니다.

  1. 내면에 <cfquery> 태그
  2. 저장 프로시저 내부
  3. 기타

문제는 모든 CRUD 작업이 각자의 방식으로 함께 속한다는 것입니다.사용자 객체(user.cfc).

<cfcomponent>
   <cffunction name="create"></cffunction>
   <cffunction name="read"></cffunction>
   <cffunction name="update"></cffunction>
   <cffunction name="delete"></cffunction>
 </cfcomponent> 

보안은 사용자 관리의 일부이므로 개체가 db 테이블과 1:1로 일치합니까?ORM과 같은 일부 환경에서는 대답이 '예'이고 다른 환경에서는 그렇지 않습니다.

보안을 사용자 관리의 일부로 생각한다면 user.cfc 이렇게 보일 수도 있습니다

<cfcomponent>
   <cffunction name="create"></cffunction>
   <cffunction name="read" hint="Read will also read security info"></cffunction>
   <cffunction name="update" hint="Perhaps this can update security too"></cffunction>
   <cffunction name="delete" hint="Delete will also delete security info"></cffunction>

   <cffunction name="create_security"></cffunction>
   <cffunction name="read_secrity" hint="This may not even be needed"></cffunction>
   <cffunction name="update_security"></cffunction>       
   <cffunction name="delete_security" hint="This may not even be needed"></cffunction>
</cfcomponent> 

결국에는 훨씬 더 적은 수의 객체가 필요하다는 것을 알게 될 것입니다(*.cfcs) 테이블보다.

좋아, 이제 너야 user.cfc 그것으로 무엇을 합니까?다양한 방법으로 앱의 나머지 부분에 연결할 수 있습니다.

  • application.User = 새로운 사용자();
  • session.User = 새로운 사용자();
  • request.User = 새로운 사용자();

이들 각각은 다음에서 매우 가깝습니다.적절한 길을 가기 전에 회원 데이터와 해당 데이터를 얼마나 오래 사용할 것인지 고려해야 합니다.

<cfcomponent>
   <cfset this.userid = ""><!--- This always points to the user I want to interact with --->

   <cffunction name="create"></cffunction>
   <cffunction name="read"></cffunction>
   <cffunction name="update"></cffunction>
   <cffunction name="delete"></cffunction>
 </cfcomponent> 

귀하의 CRUD 작업이 동일한 작업과 상호 작용할 가능성이 높습니다. UserID 그들의 모든 운영을 위해.기록을 업데이트한 후에는 그 기록을 자주 읽게 될 것입니다.항상 어떤 것을 말하는 것보다 UserID 상호 작용하는 경우 한 번만 설정하고 모든 기능이 동일한 기능을 사용하도록 할 수 있습니다.

좋아, 이제 그것들을 사용할 곳으로 돌아가자

애플리케이션.사용자

단 하나 User 개체는 전체 시스템에 존재합니다.사이트에 요청이 들어오면 생성됩니다.이 개체는 모든 요청에 ​​대해 공유됩니다.당신이 당신의 user 여기에 개체가 있으면 모든 요청이 동일한 사용자를 보게 될 것임을 나타냅니다.

세션.사용자하나 User 객체는 외부 세계의 특정 최종 사용자를 위해 존재합니다.이는 다른 모든 최종 사용자와 분리됩니다.이는 각 최종 사용자가 자신의 방식을 살펴보게 됨을 의미합니다. user 그리고 사이트를 클릭하더라도 여전히 같은 내용을 보게 됩니다. user

요청.사용자하나 User 요청마다 개체가 존재합니다.특정 요청에 대해서만 존재하며 이후에는 삭제됩니다.이는 특정 부분을 살펴보는 것을 의미합니다. User 이 요청에서는 의미가 있지만 다음 요청은 상당히 다를 수도 있고 사용자에 관한 것이 아닐 수도 있습니다.

~~~~~~~~~~~~~~~

결국에는 DB 상호 작용을 묶는 방법과 묶인 작업을 함께 유지할 기간을 결정해야 합니다.

다른 팁

데이터베이스와 관련되어 있다는 사실은 코드 반복이 있다는 사실만큼 관련성이 없습니다.코드를 더 재사용하기 쉽게 만들기 위한 노력은 올바른 방향으로 가고 있습니다.

쿼리를 CFC에 넣으면 한 단계 더 나아가는 것을 고려할 수 있습니다.항상 호출하는 대신 Application.cfc의 onApplicationStart 메서드를 사용하여 모든 페이지의 모든 사용자가 사용할 수 있는 애플리케이션 변수를 만듭니다.

또 다른 접근 방식은 이러한 모든 데이터베이스 태그를 .cfm 파일에 넣고 Application.cfc의 onRequestStart 메소드에 cfinclude를 넣는 것입니다.

두 가지 방법 모두 작동합니다.그리고 두 가지를 비교할 때 거의 항상 그렇듯이 각각은 다른 것보다 장점이 있습니다.

테이블 당 모델이 있습니다.

거기에는 해당 테이블에 대해 모든 작업을 수행하는 모든 쿼리가 있습니다.

Users 테이블을 가정해 보겠습니다.

사용자.cfc

쿼리를 반환하는 모든 메서드가 있습니다.

getUsers - 모든 사용자 반환

getUserById - 첫 번째 함수의 매개변수일 수도 있습니다.

그런 다음 주문 내역이 업데이트되는 위치를 확인해야 할 때 살펴볼 곳은 한 곳뿐입니다.

이런 결과가 나오네요

<cfset users = new model.Users().getUsers() />

또는 스크립트를 사용합니다

users = new model.Users().getUsers();

정말 용감하다면 스크립트에서도 모든 쿼리를 수행해 보세요.

마지막으로 고려해야 할 사항은 데이터가 변경되지 않는 경우 쿼리를 캐시하는 것입니다.

OrderType 또는 이와 유사한 것들은 쿼리를 반복해서 반복하는 것보다 많은 성능 이점을 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top