programing

모든 핵심 데이터 관계에 역관계가 있어야 합니까?

golfzon 2023. 5. 4. 20:49
반응형

모든 핵심 데이터 관계에 역관계가 있어야 합니까?

엔티티 클래스가 두 개 있다고 가정해 보겠습니다.SocialApp그리고.SocialAppType

SocialApp이 하나 있습니다: 이하있다니습나속성.appURL의 관계: 하의관계나::type.

SocialAppType세 속성이 : 세가지속있습다니이성다있.baseURL,name그리고.favicon.

SocialApptype는 의단레코다니입드일▁in에 있는 싱글 입니다.SocialAppType.

를 들어,계정의 의 "flickr" 계정, "flickr" .SocialApp각 기록이 개인의 계정에 대한 링크를 보유하고 있는 기록.있을 것입니다.SocialAppType"Flickr" 유형에 대한 레코드, 그 모든 것.SocialApp기록들은 가리킬 것입니다.

이 스키마를 사용하여 응용 프로그램을 빌드할 때 다음 사이에 역관계가 없다는 경고가 표시됩니다.SocialAppType그리고.SocialApp.

 /Users/username/Developer/objc/TestApp/TestApp.xcdatamodel:SocialApp.type: warning: SocialApp.type -- relationship does not have an inverse

내가 역이 필요한가요, 그리고 왜?

Apple 설명서에는 역관계를 갖지 않아 문제가 발생할 수 있는 상황을 보여주는 좋은 예가 있습니다.이 사건에 지도를 만들어 봅시다.

합니다.여기에 이미지 설명 입력

참고로 당신은 "유형"이라고 불리는 일대일 관계를 가지고 있습니다.SocialAppSocialAppType관계는 선택 사항이 아니며 "거부" 삭제 규칙이 있습니다.

이제 다음을 고려합니다.

SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated

[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];
BOOL saved = [managedObjectContext save:&error];

관계가 선택 사항이 아닌 동안 삭제 규칙을 거부로 설정했기 때문에 이 컨텍스트 저장이 실패할 것으로 예상됩니다.

하지만 여기서는 저장이 성공합니다.

그 이유는 우리가 역관계를 설정하지 않았기 때문입니다.따라서 appType을 삭제해도 socialApp 인스턴스가 변경된 것으로 표시되지 않습니다.따라서 저장하기 전에 socialApp에 대한 검증이 수행되지 않습니다(변경이 발생하지 않았기 때문에 검증이 필요하지 않다고 가정함).하지만 실제로 변화가 일어났습니다.하지만 그것은 반영되지 않습니다.

appType을 호출하는 경우

SocialAppType *appType = [socialApp socialAppType];

appType이 0입니다.

이상하죠?비선택적 속성에 대해 0을 얻는 건가요?

따라서 역관계를 설정했다면 문제가 없습니다.그렇지 않으면 다음과 같이 코드를 작성하여 강제 검증을 수행해야 합니다.

SocialApp *socialApp;
SocialAppType *appType;
// assume entity instances correctly instantiated

[socialApp setSocialAppType:appType];
[managedObjectContext deleteObject:appType];

[socialApp setValue:nil forKey:@"socialAppType"]
BOOL saved = [managedObjectContext save:&error];

실제로, 저는 역방향이 없기 때문에 데이터 손실을 경험한 적이 없습니다. 적어도 제가 알고 있는 바와 같습니다.빠른 구글은 당신이 그것들을 사용해야 한다고 제안합니다:

역관계는 단순히 정리만 하는 것이 아니라 실제로 핵심 데이터에서 데이터 무결성을 유지하기 위해 사용됩니다.

코코아 데브 센트럴

일반적으로 양방향 관계를 모형화하고 역관계를 적절하게 지정해야 합니다.핵심 데이터는 이 정보를 사용하여 변경된 경우 개체 그래프의 일관성을 보장합니다("관계 및 개체 그래프 무결성 조작" 참조).양방향으로 관계를 모형화하지 않는 몇 가지 이유와 모형화하지 않을 경우 발생할 수 있는 몇 가지 문제에 대한 자세한 내용은 "단방향 관계"를 참조하십시오.

핵심 데이터 프로그래밍 가이드

Dave Mark와 Jeff LeMarche의 More iPhone 3 Development에서 찾은 결정적인 답변을 바꿔보겠습니다.

일반적으로 앱에서 역관계를 사용하지 않더라도 항상 역관계를 만들고 지정하는 것이 좋습니다.이러한 이유로 역을 제공하지 못할 경우 경고가 표시됩니다.

역관계가 성능을 저하시킬 수 있는 몇 가지 시나리오가 있기 때문에 관계에 역관계가 필요하지 않습니다.예를 들어, 역관계에 매우 많은 개체가 포함되어 있다고 가정합니다.역을 제거하려면 역을 나타내는 집합을 반복하여 성능을 약화시켜야 합니다.

하지만 그렇게 하지 않을 특별한 이유가 없다면, 반대의 모델을 만드세요.핵심 데이터가 데이터 무결성을 보장하도록 지원합니다.성능 문제가 발생하면 나중에 역관계를 제거하는 것이 비교적 쉽습니다.

역이 없는 핵심 데이터 관계에 대해 좋은 사례를 만들 수 있는 시나리오가 적어도 하나 있습니다. 즉, 두 개체 사이에 이미 다른 핵심 데이터 관계가 있을 때, 개체 그래프를 유지 관리할 수 있습니다.

예를 들어, 한 페이지가 한 책에 있는 동안 한 책은 많은 페이지를 포함합니다.이것은 쌍방향 다대1 관계입니다.페이지를 삭제하면 관계가 무효화되고, 책을 삭제하면 페이지도 삭제됩니다.

그러나 각 책에 대해 읽고 있는 현재 페이지를 추적할 수도 있습니다.작업은 페이지의 "currentPage" 속성으로 수행할 수 있지만, 책의 한 페이지만 현재 페이지로 표시되도록 하려면 다른 논리가 필요합니다.대신 현재 페이지 관계를 Book에서 단일 페이지로 설정하면 항상 현재 페이지가 하나만 표시되며, 또한 book.currentPage만 있는 책을 참조하여 이 페이지에 쉽게 액세스할 수 있습니다.

서적과 페이지 간의 핵심 데이터 관계를 그래픽으로 표현

이 경우 상호 관계는 무엇입니까?거의 말도 안 되는 것."myBook" 또는 유사한 내용이 다른 방향으로 다시 추가될 수 있지만, 페이지에 대한 "book" 관계에 이미 포함된 정보만 포함되어 있기 때문에 위험이 발생합니다.미래에는 이러한 관계 중 하나를 사용하는 방식이 변경되어 핵심 데이터 구성이 변경될 수 있습니다.if page.myBook이 페이지가 있는 일부 장소에서 사용되었습니다.코드에 책이 사용되었어야 했는데, 문제가 있을 수 있습니다.이 문제를 사전에 방지하는 또 다른 방법은 페이지에 액세스하는 데 사용되는 NSManagedObject 하위 클래스에 내 책이 노출되지 않도록 하는 것입니다.그러나, 애초에 역을 모형화하지 않는 것이 더 간단하다고 주장할 수 있습니다.

설명된 예제에서 현재 페이지 관계에 대한 삭제 규칙은 "Nullify"와 상호 관계가 없으므로 "No Action" 또는 "Cascade"로 설정해야 합니다. (Cascade는 책을 읽을 때 모든 페이지를 찢는 것을 의미하지만, 특히 차갑고 연료가 필요한 경우에는 그럴 수도 있습니다.)

이 예와 같이 객체 그래프 무결성이 위험하지 않고 코드 복잡성과 유지 관리성이 향상된다는 것을 증명할 수 있을 때, 역이 없는 관계가 올바른 결정일 수 있다고 주장할 수 있습니다.


의견에서 설명한 것처럼 다른 해결책은 대상에 자체 UUID 속성을 생성하고(여기 예에서는 모든 페이지가 UUID인 ID를 가지고 있음), 이를 속성으로 저장하는 것입니다(currentPage는 UUID를 관계가 아닌 속성으로 Book에 저장합니다).그런 다음 필요할 때 일치하는 UUID를 가진 페이지를 가져오는 방법을 작성합니다.이것은 아마도 역관계를 사용하지 않는 것보다 더 나은 접근법일 것입니다. 논의된 경고 메시지를 피하기 때문은 아닙니다.

더 나은 질문은 "반전이 없을 이유가 있는가"입니다.핵심 데이터는 지속성 프레임워크가 아닌 객체 그래프 관리 프레임워크입니다.즉, 객체 그래프에서 객체 간의 관계를 관리하는 역할을 합니다.역관계는 이것을 훨씬 더 쉽게 만듭니다.이러한 이유로 코어 데이터는 역관계를 기대하며 해당 사용 사례에 맞게 작성됩니다.개체가 없으면 개체 그래프 일관성을 사용자가 직접 관리해야 합니다.특히 역관계가 없는 많은 관계는 일을 계속하기 위해 열심히 노력하지 않는 한 핵심 데이터에 의해 손상될 가능성이 매우 높습니다.역관계에 대한 디스크 크기 측면의 비용은 이점에 비해 미미합니다.

문서에 역방향이 필요하지 않은 것처럼 보이지만, 저는 역방향이 없기 때문에 실제로 "데이터 손실"을 초래한 시나리오를 해결했습니다.보고서 개체와 보고서 개체 간에 많은 관계가 있는 보고서 개체가 있습니다.역 관계가 없으면 대 다 관계의 모든 변경 사항은 다시 시작할 때 손실됩니다.Core Data 디버그를 검사한 결과 보고서 개체를 저장했지만 개체 그래프(관계)에 대한 업데이트가 전혀 이루어지지 않았습니다.저는 역을 추가했습니다, 비록 제가 사용하지는 않지만, voila, 그것은 효과가 있습니다.그래서 그것이 필요하다고 말하지 않을 수도 있지만, 반전이 없는 관계는 분명히 이상한 부작용을 일으킬 수 있습니다.

역변환은 다음에도 사용됩니다.Object Integrity으)ㄹ 수 있습니다.

권장되는 방법은 양방향 관계를 모형화하고 역관계를 적절하게 지정하는 것입니다.핵심 데이터는 이 정보를 사용하여 변경된 경우 객체 그래프의 일관성을 보장합니다.

보낸 사람: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreData/HowManagedObjectsarerelated.html #//apple_ref/doc/uid/TP40001075-CH17-SW1

제공된 링크는 당신이 왜 그것을 가져야 하는지에 대한 아이디어를 제공합니다.inverseset. dataset을 수 . 이것이 없으면 데이터/청렴성을 잃을 수 있습니다.또한, 당신이 접근할 수 있는 가능성.nil그럴 가능성이 높습니다.

일반적으로 역관계는 필요하지 않습니다.그러나 역관계가 필요한 코어 데이터에는 잡음/버그가 거의 없습니다.역관계가 누락된 경우 컨텍스트를 저장하는 동안 오류가 발생하지 않아도 관계/객체가 누락되는 경우가 있습니다.예제는 코어 데이터를 사용하는 동안 누락된 개체와 해결 방법을 보여주기 위해 만든 것입니다.

언급URL : https://stackoverflow.com/questions/764125/does-every-core-data-relationship-have-to-have-an-inverse

반응형