본문 바로가기
프로그래밍/iOS

[Core Data] Relationship / Inverse Relationships

by 백룡화검 2013. 7. 21.

출처 : http://warmz.tistory.com/805


참고::

http://brandontreb.com/core-data-quicktip-inverse-relationships/



Inverse라는 속성에 대해 알기 전 Database에서 Relationship이라는 것이 무엇인지부터 파악해 볼 필요가 있다.


Relationship in Database

Database에서 관계(Relationship)이란 두 개의 Entity나 그 자신과의 특정 관계를 양방향으로 표현하는 수단이다. 현재의 관계나 장래 유용한 관계만을 한정적으로 표시하는데 각 방향의 관계에는 반드시 아래 사항들을 명시해야 한다.

 1. 관계 명칭
 2. 선택 사양(Optionality)
 3. 관계형태 (Degree)

 * 모든 Entity1은 [단 하나씩 / 하나이상] 의 Entity2를(에) [반드시 관계명 해야한다 / 관계명 일 수도 있다.]

 - 관계명은 구체적이어야 한다.
 - 주는 쪽(One) : 특정 집합만 관계를 가질 때는 해당 집합을 표현하는 것이 좋다.
 - 받는 쪽(One or Many) : 최대한 관계 내용을 구체적으로 표현하는 것이 좋다.


Relationship 표현

1. 두 Entity 사이에 선을 그린다.

2. 관계명칭을 기록한다.

3. 선택 사양(Optionality)를 표시한다.

    점선 : 선택적(~ 일 수도 있다.)

    실선 : 무조건(반드시 ~ 해야한다.)

4. 관계 형태(Degree)를 표시한다.

    실선 하나 : 단 하나씩(one and only one)

    실선 한 가닥에 여러 실선이 연결 : 하나 이상(one or more)



Relationship Read

 1. 먼저 한 방향(좌 ➝ 우)을 읽고

 2. 다른 방향 (우 ← 좌)을 읽는다.




Inverse Relationship in Core Data

코어 데이터에서도 Relationship은 크게 다르지 않다. 그러나 Inverse(역전)라는 기능을 제공하고 있는데 이 것은 두 개의 Entity가 관계되어 있을때 만약 Entity1가 변경된다면 관계되어 있는 Entity2의 내용도 그에 맞게 변경되게 해주는 역할을 한다. Apple 개발자 문서에 따르면 Core Data framework는 각 Entity들의 Relationships를 통해 유기적인 연결을 더욱 강하게 만들어준다고 한다. 

Relationships의 Inverse 옵션

Entity간의 Relationship


예를 보자. 위 그림을 보면 Role(역할)이라는 Entity와 Person(사람)이라는 Entity는 서로 관계(1:n)를 맺고 있다. 이것이 의미하는 것은 하나의 역할은 다수의 사람을 소유할 수 있고, 한 명의 사람은 반드시 하나의 역할만을 가지고 있다라는 것이다. 이 관계는 만약 역할명(Role - name)이 변경되면 그 역할을 가지고 있는 사람의 역할명도 변경되어야 한다는 무결성을 지켜야한다. 코드로 나타내보면 아래와 같다.

1
2
3
4
5
6
7
8
9
Role *role = [[Role alloc] init];
Person *john = [[Person alloc] init];
 
// 해당 역할을 맡을 사람 추가
[role addPersonObject:john];
 
// Inverse 옵션을 통해 자동으로 추가되는 코드.
// 각 사람은 단 하나의 역할만을 맡는다.
[john setRole:role];

Inverse 옵션을 사용하면 바로 역전 관계가 성립되면서 유기적인 연결이 이루어진다. 반대로도 마찬가지다. 결국 하나가 변경되면 연결되어 있는 다른 나머지 하나도 그에 맞게 변경된다. 개발자가 신경써야할 부분이 자동적으로 줄어든다는 것이다.

두 개의 Entity간의 관계