2010-06-05 2 views
3

CakePHP 응용 프로그램에서 데이터베이스에 대해 설명되는 고유 제한 조건의 경우 모델에서 동일한 유효성 검사를 수행하면 어떤 이점이 있습니까?왜 모델에서 데이터베이스 제약 조건을 반복합니까?

JS 유효성 확인의 이점을 알고 있지만이 모델 유효성 검사로 인해 DB가 추가로 이동합니다. 나는 모델 유효성 검사가 단순히 중복 될 수 있도록 DB에서 특정 유효성 확인이 이루어 졌는지 100 % 확신합니다.

내가 볼 수있는 유일한 이점은 실수를 인식하고 적절한 필드에서 오류 메시지를 표시하고 필드를 다시 채우고 실수를 인식하여 앱을 조정하는 것이지만 제약이있는 경우 달성 할 수 있습니다. 명명 규칙 및 그래서 응용 프로그램이 문제를 저장 (현재 기존 방법을 이해할 수있는 이해할 수 있습니까?)

답변

2

더 빠른 데이터베이스 응답 시간. 고객에게 유효성 검사 (예 : 자바 스크립트)를 더 빨리 할 수 ​​있습니다. 주된 단점은 여러 레이어에 동일한 규칙을 구현해야한다는 것입니다.

+1

어떤 유효성 검사가 수행되는지에 따라 다르지만 모델의 레코드를 확인하면 데이터 확인을 위해 db로 돌아가는 것을 의미합니다. 유효하다고 가정 할 때, 그것은 db에 대한 두 번의 여행입니다. 그리고 올바른 생각을 가진 사람은 기본 형식을 넘어서 비즈니스 논리 유효성 검사를 통해 Javascript를 신뢰하지 않습니다. –

+0

모델의 레코드를 검증 할 때 데이터베이스로의 이동이 필요하지 않습니다. 자바 스크립트 유효성 검사를 위해서는 동의합니다. –

+0

-k_b - 고유 제한 조건이 데이터베이스에 액세스해야합니까? 다른 유형의 유효성 확인에 동의합니다. – BWelfel

1

당신이 얻는 이득은 아마도 중복으로 조건을 유지하는 번거 로움에 의해 취소 될 것입니다. 단일 위치에서 이들을 지정하고 동기화 할 수있는 쉬운 메커니즘이 없으면 다른 위치의 한 위치를 고수하는 것이 좋습니다.

2

데이터베이스 제약 조건이 한 사람에 의해 코드화되고 나머지 코드가 다른 코드에 의해 코드화되면 서로를 완전히 신뢰해서는 안됩니다. 경계에서 사물을 확인하십시오. 특히 조직 - 사람 경계를 나타내는 경우에 특히 그렇습니다. 예 : 사용자 대 응용 프로그램 또는 개발자 모듈 하나를 다른 모듈로, 또는 한 부서를 다른 모듈로 나눌 수 있습니다.

0

이상적으로 모델의 디자인은 모델에서 파생 된 데이터베이스 스키마와 함께 가장 먼저 이루어져야합니다 (사용자 사례, 사례 등을 토대로 함). 그런 다음 데이터베이스 구현을 모델 (명시 적으로 단일 소스에 모두 연결)에서 생성하거나 데이터베이스 제약 조건을 관계형 무결성 요구 사항 (개념적으로 다르며 일반적으로 다른 세분성 및 어휘를 가짐)을 기반으로 설계 할 수 있습니다. 대부분의 경우 매핑이 있습니다.

일반적으로 데이터베이스 제약 조건에 대한 관계 무결성 요구 사항 만 있습니다. 비즈니스 제약 조건의 세분성과 보편적 적용 가능성이 너무 부각되는 경우가 너무 많습니다. 데이터베이스 설계자가 알고있는 것보다 일시적이며 정교하며 시간이 지남에 따라 그리고 애플리케이션 모듈 전반에 걸쳐 더 자주 변경됩니다.

0

@ le dorfier

데이터 무결성과 비즈니스 규칙의 문제는 "새로운 고객이 들어 왔을 때, 그럴듯한 콘텐츠가있는 메일"과 같은 절차 적 "비즈니스 규칙" 해당 고객의 이메일 주소로 보내야 함).

관계형 대수학은 일반적으로 "표현 완성"으로 받아 들여집니다 (RA와 TC가 튜링 완료임을 공식적으로 증명했습니다). 따라서 RA (plus TC)는 "모든 것이 잘못되었습니다"(일부/임의의 "비즈니스 규칙"을 위반한다는 의미에서 잘못됨) 표현할 수 있습니다.

"잘못된 것의 집합은 비어 있어야합니다"라는 규칙을 시행하면 프로그래머가 할 필요없이 생각할 수있는 (데이터 관련, 즉 상태 관련) 비즈니스 규칙을 적용하는 dbms로 귀결됩니다. 비즈니스 규칙 실행을 달성하기 위해 코드의 첫 번째 바이트를 작성하십시오.

"비즈니스 규칙은 자주 변경됩니다"를 인수로 가져옵니다.비즈니스 규칙이 변경되면 제약 조건/비즈니스 규칙을 적용하는 RA의 해당 표현식 만 변경하거나 찾아야하는 등 비즈니스 규칙에 시스템을 가장 빠르게 적용 할 수있는 시나리오는 무엇입니까? 여기서 응용 프로그램 코드에서 규칙이 적용되고 모든 것을 변경해야합니까?

@ bradley harris.

수정. 투표가 가능하면 나에게 투표 해 줄거야. 하지만 이 될 수 있으므로 은 실제로 일 수 있습니다. 일부 데이터베이스는 다른 앱에서 필요하지 않을 수도 있습니다. 비즈니스 규칙 적용을 수행 할 수있는 유일한 곳은 DBMS 내부입니다.

+0

저는 비즈니스 규칙이 어디에 속해 있는지 절대적으로 선호하지 않습니다. RDBMS 도구 및 구문은 누가 데이터에 액세스하거나 변경하더라도 규칙을 적용하는 훌륭한 작업을 수행합니다. 종종 단일 언어로 더 빨리 개발할 수 있도록 Rails와 같은 응용 프로그램 프레임 워크에이를 신뢰하는 것이 현명합니다. 나는 하나의 솔루션이 정말로 모든 것에 적합하다고 생각하지 않습니다. –

1

저장 또는 업데이트 쿼리가 데이터베이스로 보내지기 전에 CakePHP의 유효성 검사가 발생합니다. 따라서 데이터베이스로드가 줄어 듭니다. 모델 유효성 검사를 통해 데이터베이스를 추가로 방문하게된다고 생각하는 것은 잘못된 것입니다. By default, validation occurs before save.

+0

고유 제한 조건이 데이터베이스로 이동합니다. – BWelfel

+0

당신이 지금 무엇을 의미하는지 봅니다. 이것은 유일 필드를 검사하는'groups' 테이블에 대한 질의입니다 :'SELECT COUNT (*) as 'count' FROM' groups' AS'Group' WHERE'Group'.'name' ='new group''. 이점은이 쿼리가 오류를 반환하지 않는다는 것입니다. 모델의 고유 필드를 검사하지 않으면 'SQL 오류 : 1062 : 중복 항목'이 포함 된 쿼리 'INSERT INTO'groups' ('name','parent_id') VALUES ('새 그룹 ', NULL)' 그룹 '키'이름 '. 아마 내가 다른 로케일을 가지고 있다면 그것은 영어가 아닐 것입니다. – bancer

+0

트랜잭션 지원이없는 데이터베이스의 saveAll() 메소드에 유용 할 수 있습니다. – bancer

2

이식성을 잊지 마십시오. 모델에서 유효성 검사를 실시하면 응용 프로그램을 데이터베이스에 독립적으로 유지할 수 있습니다. SQLite 데이터베이스에 대해 응용 프로그램을 프로그래밍 한 다음 MySQL에 배포 할 수 있습니다. 오, 기다리지 마십시오. PostgreSQL? 아니? 오, 오라클.

또한 프로덕션 환경에서 저장 및 리디렉션되는 일반적인 컨트롤러 동작에서 데이터베이스 오류가 발생하면 오류가 발생하고 출력 할보기가 없기 때문에 사용자가 빈 페이지를 기다리고 있습니다. 리디렉션은 절대로 발생하지 않았습니다). 기본적으로 DB 스키마에 대한 통찰력을 제공 할 수 있으므로 프로덕션 모드에서는 데이터베이스 오류가 해제되지만 모델 유효성 검사 오류는 사용하기 쉽도록 유지됩니다.

당신은 요점이 있지만, 이러한 데이터베이스 오류를 캡처하고 그들과 함께 뭔가 유용한 일이 가능합니까? 현재는 아니지만 CakePHP가 실패한 모델 유효성 검사 규칙으로 동적으로 변환하여 스스로를 반복하지 못하게하면 좋을 것입니다. 서로 다른 데이터베이스가 다른 오류를 발생 시키므로 각 DBO 데이터 소스가 업데이트되기 전에이를 지원해야합니다.

관련 문제