어떤 종류의 데이터베이스에 유지되는 일종의 데이터 구조가 있다고 가정 해 봅시다. 간단히하기 위해이 데이터 구조를 호출 해 봅시다 Person
. 이제 CRUD API를 설계해야하는데,이를 통해 다른 응용 프로그램에서을 만들고 읽고 업데이트하고 삭제할 수 Person
있습니다. 간단하게하기 위해이 API는 어떤 종류의 웹 서비스를 통해 액세스한다고 가정합니다.
CRUD의 C, R 및 D 부분의 경우 설계가 간단합니다. C #과 유사한 기능 표기법을 사용하겠습니다. 구현은 SOAP, REST / JSON 또는 기타 일 수 있습니다.
class Person {
string Name;
DateTime? DateOfBirth;
...
}
Identifier CreatePerson(Person);
Person GetPerson(Identifier);
void DeletePerson(Identifier);
업데이트는 어떻습니까? 자연스럽게해야 할 일은
void UpdatePerson(Identifier, Person);
그러나 업데이트 할 필드를 어떻게 지정 Person
하시겠습니까?
내가 생각 해낼 수있는 솔루션 :
당신은 항상 완전한 Person을 전달 하도록 요구할 수 있습니다. 즉, 클라이언트는 생년월일을 업데이트하기 위해 다음과 같은 것을 할 것입니다 :
p = GetPerson(id); p.DateOfBirth = ...; UpdatePerson(id, p);
그러나 Get과 Update 사이에 일종의 트랜잭션 일관성 또는 잠금이 필요합니다. 그렇지 않으면 다른 클라이언트가 병렬로 수행 한 다른 변경 사항을 덮어 쓸 수 있습니다. 이것은 API를 훨씬 더 복잡하게 만듭니다. 또한 다음 의사 코드 (JSON 지원 클라이언트 언어 가정) 때문에 오류가 발생하기 쉽습니다.
UpdatePerson(id, { "DateOfBirth": "2015-01-01" });
- 올바르게 보인다 -DateOfBirth를 변경할뿐만 아니라 다른 모든 필드를 null로 다시 설정합니다.
인 모든 필드를 무시할 수 있습니다
null
. 그러나 변경하지 않는DateOfBirth
것과 의도적으로 null로 변경하는 것 사이의 차이점은 무엇입니까?서명을로 변경하십시오
void UpdatePerson(Identifier, Person, ListOfFieldNamesToUpdate)
.서명을로 변경하십시오
void UpdatePerson(Identifier, ListOfFieldValuePairs)
.전송 프로토콜의 일부 기능을 사용하십시오. 예를 들어, Person의 JSON 표현에 포함되지 않은 모든 필드를 무시할 수 있습니다. 그러나 일반적으로 JSON을 직접 파싱해야하며 라이브러리의 내장 기능 (예 : WCF)을 사용할 수 없습니다.
그 해결책 중 어느 것도 나에게 정말 우아해 보이지 않습니다. 분명히 이것은 일반적인 문제이므로 모든 사람이 사용하는 가장 좋은 방법은 무엇입니까?
Person
여전히 유지되지 않는 새로 생성 된 인스턴스의 경우 식별자가 지속성 메커니즘의 일부로 결정된 경우에는 null로 두십시오. 답에 관해서는 JPA는 버전 번호를 사용합니다. 버전 23을 읽으면 DB의 버전이 24 인 경우 항목을 업데이트 할 때 쓰기가 실패합니다.