2016-07-08 2 views
0

주어진 객체가 N 개의 자식 객체를 가질 수없는 비즈니스 레벨 제약이 있다고 가정 해보십시오. 자식 개체를 만드는 경우 해당 개체에 대해 N 개 이상의 자식 개체를 만들지 않도록하려면 어떻게해야합니까?RDBMS의 다중 행 테이블 제약

READ를 수행하여 기존 자식 개체의 수를 얻는 경우 N보다 작다는 것을 확인한 다음 테이블에서 INSERT를 수행하면 다른 INSERT가 들어갈 수 있었던 READ와 INSERT 사이에 시간이 있습니다.

다른 쿼리에 나쁜 영향을 줄 수 있으므로 테이블을 잠글 필요가 없습니다.

보다 구체적인 예는 Resident 개체와 Home 개체가있는 경우입니다. Resident 테이블에는 id, resident_name, home_id와 같은 것이 있습니다. 4 명 이상의 거주자가 동일한 home_id를 갖지 않도록하려면 어떻게합니까?

+0

SQL에서하지 말고 프로그램 논리에서 수행 –

+0

응용 프로그램에서 수행하는 경우, 어떤 종류의 잠금 메커니즘이 있습니까? 나는 두 번째 단락에서 그것을 호출했다. READ, VALIDATE, INSERT를 수행하면 다른 INSERT가 중간에 들어갈 수있다. 성능에 좋지 않은 테이블 전체를 잠그지 않는 한. – thait84

답변

0

관계형 데이터베이스 제약 조건은 비즈니스 규칙을 구현하기 위해 설계된 것이 아니며 기술 수준에서 데이터 무결성을 보호하기 위해 설계되었으며 많은 현대 개발자는 DB를 전혀 보지 않는 것을 선호합니다. 간단한 지속성 메커니즘. 하지만, 일부 데이터베이스에서는 저장된 procs 및 트리거를 사용하여 원하는 것을 얻을 수 있다고 말하면서 말입니다.

이 규칙을 '절대로'위반하지 않으려면 DB가 데이터베이스에 액세스하는 유일한 방법 인 서비스의 개인 데이터 저장소가되어야하며 모든 액세스가 해당 서비스를 통해 이루어져야합니다 . 이 서비스는이 규칙과 다른 비즈니스 규칙을 명확하고 일관된 방식으로 구현할 수 있습니다.

+0

나는 응용 프로그램 코드에서도 그렇게하고있다. 나는 당신이 응용 프로그램 코드에서 그것의 유효성을 검사하고 여전히 데이터 무결성을 보장 할 수있는 방법을 보려고합니다. – thait84

+0

테이블을 잠그지 않고 DB 레벨에서 가능한 방법을 모르겠다. 앱 수준이라 할지라도 동시성에 문제가있을 것입니다. –

+0

내가 생각한 한 가지는 레지던트 테이블의 데이터를 변경하려는 요청이 홈 테이블의 해당 특정 홈에 대한 잠금을 가져야하는 것입니다. 그런 다음 특정 가정의 거주자에 대한 데이터를 읽거나 검증하거나 변형 할 수 있으며 다른 누구도 귀하의 데이터를 수정하지 못하도록 할 수 있습니다. 이것은 또한 독서/수정하고있는 다른 사람들에게 악영향을 미치지 않도록합니다. 다른 가정의 거주자는 전체 테이블 잠금 장치로 일어날 일을 좋아합니다. – thait84