2010-12-10 3 views
2

우리는 사용자가 데이터베이스 테이블의 필드에서 계산을 수행하는 표현식을 입력 할 수있는 응용 프로그램을 보유하고 있습니다. 계산을 통해 다양한 유형의 함수 (수학, 논리, 문자열, 날짜 등)를 사용할 수 있습니다. 예 : MAX (col1, col2, col3). 이 표현식은 중첩 된 함수를 사용하여 복잡해질 수 있습니다. 예 : (LENGTH (StringColumn) = 0, MAX (COL1, COL2, 32), MIN (COL1, COL2, COL3))> 길이 (COL2) 우리는 이것에 자바 CC 파서를 구비한다 구현디자인 문제 - 비즈니스 계산을위한 SQL 쿼리 생성

편도 IF 사용자가 입력 한 표현식을 구문 분석 한 다음 트리 구조의 데이터 구조를 생성합니다. 그런 다음 트리가 java에서 구문 분석되고 표현식에 사용 된 각 함수에 대해 sql 쿼리가 생성됩니다. 마지막으로 사용자 입력 식 각각에 대해 쿼리가 생성 된 후 java는 간단한 데이터베이스 호출을 사용하여이 쿼리를 실행합니다.

이 프레임 워크의 주요 문제점은 데이터베이스 문제가 Java에서 처리된다는 것입니다. 데이터베이스 문제는 데이터베이스 제한 또는 성능 최적화를 의미합니다. Microsoft SQL Server의 한 가지 데이터베이스 제한 사항은 10 개의 중첩 된 CASE WHEN 문만 허용된다는 것입니다. 즉, java 코드를 구문 분석하는 동안 쿼리 문자열이 번역되기 전에 얼마나 많은 CASE WHEN을 사용해야 하는지를 예측해야합니다. 비슷하게 수행 할 SQL 성능 최적화가있는 경우 java에서 처리하는 것이 단순히 논리적이 아닌 것입니다.

누구든지이 문제에 대한 더 나은 설계 접근법을 알고 있습니까?

답변

1

SQL로 변환되는 SQL과 유사한 언어를 다시 구현하는 대신 사용자가 SQL로 데이터베이스를 쿼리하게합니다.

+1

이것은 소프트웨어에서 제공하는 기능입니다. 소프트웨어 사용자는 기술적으로 SQL 언어를 알지 못합니다. 그들은 위에서 언급 한 것처럼 비즈니스 기능을 제공 받고 있습니다. 예 : MAX (column1, column2)와 같은 수학 함수. 그런 다음이 함수를 SQL 쿼리로 변환하여 예상 된 계산을 수행해야합니다. –

+0

귀하의 언어는 SQL보다 복잡합니다! 개발자도 'IF (LENGTH (StringColumn) = 0, MAX (col1, col2, 32), MIN (col1, col2, col3))> LENGTH (col2)'와 같은 것을 쓰지는 않지만, 그걸 쓰고있어. 그들이 그것을 쓸 수 있다면, 그들은 SQL을 쓸 수 있습니다! 그리고 독점적 인 언어를 배울 필요조차 없습니다. 그들은 수십 년에 걸친 문서화, 예제 및 도구의 혜택을 얻습니다. 신청서가 작성되었을 때 최소한이 시스템의 작성에 반대하여 로비를하길 바랍니다. –

+0

저는 어플리케이션 사양을 디자인 한 기능 팀에 속해 있지 않았습니다. 앞서 언급 한 기능을 제공해야한다고 가정하면이 기능을 구현하는 더 좋은 방법이 있다고 생각합니까? –

0

은 몇 시간 전 내가 동적 필터 루틴과 자바 애플릿을 쓰고 거기에 내가 자바 스크립트 문에 SQL 문을 번역하고 내가 최대 절전 모드로 보일 것이다

+0

"javascripts exec 함수로 실행"이란 무엇을 의미합니까? 쿼리는 데이터베이스에 대해 실행해야합니다. – sleske

1

자바 스크립트 간부 기능을 실행하고 HQL 쿼리 언어입니다.

위의 포스터에 대한 응답으로 SQL 인젝션 공격에 노출 될 수 있으므로 사용자가 직접 SQL로 데이터베이스를 쿼리하도록하는 것이 좋지 않을까 생각합니다.

+0

이것은 최대 절전 모드 매핑 된 개체가 아닙니다. 응용 프로그램에서 제공하는 기능은 사용자가 테이블에있는 데이터에 대해 계산을 수행 할 수있게하는 것입니다. 앞서 언급했듯이 계산은 비즈니스 기능을 의미합니다. 사용자는 표현식을 입력하여 소프트웨어가 예상 한 계산을 수행하도록 구문 분석 할 수 있습니다. 이 프로세스의 출력은 계산 된 데이터를 포함하는 다른 데이터 테이블입니다. –

+0

직접 SQL 접속을 허용 할 수 있습니다. 이것이 데이터베이스 모델의 여러 계층 (액세스 제어, 외부 뷰) 전용입니다. 읽기 전용보기를 만들거나 수정하면 안되는 것을 수정할 수있는 권한을 사용자에게 부여하지 마십시오. –

0

당신은 JPA 2.0 기준 API를 살펴하거나 기준을 API

  • 최대 절전 모드 수 JPA 2.0은 소위 기준 API (http://stackoverflow.com/questions/2602757/creating-queries-using을 제공합니다 -criteria-api-jpa-2-0)
  • Hibernate는 JPA 2.0 이전의 경우에도 고유 한 Criteria API를 가지고 있지만 JPA 2.0 Criteria API와는 다릅니다. (http://www.ibm.com/developerworks/java/library/j-typesafejpa/)

모두 기준의 API의 목적은보다 쾌적한 방법으로 런타임시 SQL 쿼리를 만들 수있는 방법을 제공하는 것입니다 문자열을 연결합니다. (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html)

(JPA 2.0 Critiera API에는 추가 기능이있어서 코드 생성을 제공합니다. 컴파일 시간 절약 방법으로 쿼리를 작성할 수 있습니다. (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html)

+0

계산은 최대 절전 모드 매핑 된 개체가 아닌 데이터베이스 테이블에서 수행해야합니다. 그러므로이 가능성은 유효하지 않을까요? –

+0

나는 그것을 해 본 적이 없지만 그것이 불가능하다는 것을 믿습니다. – Ralph

0

데이터베이스가 지원하는 언어 인식기 (필자의 경우 오라클)를 찾아야한다고 생각했습니다. 유사한 프레임 워크가 데이터베이스에 의해 지원된다면 java (즉, javacc)에서 현재 사용하는 것과 비슷하게 중간 문자열을 구문 분석하고 SQL 쿼리로 변환 할 수 있습니다. 여기서 참조하는 중간 문자열은 사용자가 입력 한 문자열과 유사하지만 정확하게 동일 할 수 있습니다 (예 : 열 이름을 실제 실제 열 이름으로 변환 할 수 있음).

이 접근 방식에 대한 의견이 있으십니까? 또한 오라클의 언어 인식기에 대한 제안은 높이 평가 될 것입니다.

감사합니다.