Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

관계 & 내장된 객체 - React Native SDK

이 페이지의 내용

  • 일대일 관계
  • 일대다 관계
  • 역관계
  • 역관계 속성 정의하기
  • 코드에서 연결 객체 찾기
  • 내장된 객체
  • Realm 객체 모델

일대일 관계는 객체가 특정 유형의 다른 객체 하나와 관련되어 있음을 의미합니다. 일대일 관계를 정의하려면 속성 유형을 관련 Realm 객체 유형으로 지정하세요.

예시

이 예시에서 Manufacturer는 단일 Car를 만듭니다.

class ToOneManufacturer extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
car?: Car;
static schema: Realm.ObjectSchema = {
name: 'ToOneManufacturer',
properties: {
_id: 'objectId',
name: 'string',
// A manufacturer that may have one Car object
car: 'Car?',
},
};
}
class Car extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
miles?: number;
static schema: Realm.ObjectSchema = {
name: 'Car',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
},
};
}

일대다 관계는 객체가 여러 객체와 관련될 수 있음을 의미합니다. 대다 관계를 정의하려면 객체 스키마에서 관련 Realm 객체 유형의 목록 또는 배열인 속성을 지정합니다.

예시

이 예시에서 Manufacturer는 여러 Car 모델을 만들 수 있습니다.

class ToManyManufacturer extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
cars!: Realm.List<LinkedCar>;
static schema: Realm.ObjectSchema = {
name: 'ToManyManufacturer',
properties: {
_id: 'objectId',
name: 'string',
// A manufacturer's related LinkedCar objects
cars: 'LinkedCar[]',
},
};
}
class LinkedCar extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
miles?: number;
static schema: Realm.ObjectSchema = {
name: 'LinkedCar',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
// A car's related ToManyManufacturer objects
manufacturer: {
type: 'linkingObjects',
objectType: 'ToManyManufacturer',
property: 'cars',
},
},
};
}

역 관계는 정의된 대일 또는 대다 관계에서 해당 객체를 참조하는 다른 모든 객체에 객체를 다시 연결합니다. 관계 정의는 기본적으로 단방향입니다. 객체 모델의 속성을 역관계로 명시적으로 정의해야 합니다.

예를 들어 '제조업체에는 자동차가 많이 있음'이라는 대다 관계는 '자동차는 제조업체에 속함'이라는 역관계를 자동으로 생성하지 않습니다. 객체 모델에서 역관계를 지정하지 않으면 자동차를 만드는 제조업체를 조회하기 위해 별도의 쿼리를 실행해야 합니다.

linkingObjects를 사용하여 객체 스키마의 속성에 역관계를 할당할 수 있습니다 이렇게 하면 일반 속성처럼 관계에 액세스할 수 있습니다.

linkingObjects 속성이 특정 관계로 역링크됩니다. 관계의 객체 유형 및 속성 이름을 사용하여 역링크할 관계를 지정합니다.

예시

이 예시 에서 ManufacturerInverse 객체의 cars 속성 은 CarInverse 객체의 Realm .List 와 다대다 관계 를 가집니다. 제조업체에 연결된 모든 자동차가 포함되어 있습니다.

CarInverse 객체의 manufacturer 속성은 이 관계를 반전시킵니다. manufacturer 속성은 cars 속성에 자동차 객체가 포함된 ManufacturerInverse 객체를 다시 참조하도록 자동으로 업데이트됩니다.

class ManufacturerInverse extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
cars!: Realm.List<CarInverse>;
static schema: Realm.ObjectSchema = {
name: 'ManufacturerInverse',
properties: {
_id: 'objectId',
name: 'string',
// A manufacturer's related CarInverse objects
cars: 'CarInverse[]',
},
};
}
class CarInverse extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
manufacturer!: Realm.List<ManufacturerInverse>;
miles?: number;
static schema: Realm.ObjectSchema = {
name: 'CarInverse',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
// A car's related ManufacturerInverse objects
manufacturer: {
type: 'linkingObjects',
objectType: 'ManufacturerInverse',
property: 'cars',
},
},
};
}

객체의 Realm.Object.linkingObjects() 메서드를 호출하여 특정 객체에 연결되는 모든 객체를 찾을 수 있습니다. 이는 객체 스키마에 속성을 추가하지 않고 특정 관계에 대한 모든 연결 객체에 액세스하려는 경우에 유용합니다.

예시

이 예시에서는 유형 'linkingObjects'의 manufacturer 필드가 없는 LinkedCar 객체 모델이 있습니다. 누군가 여러 제조업체와 자동차 객체를 생성하여 새로 생성된 자동차를 제조업체의 cars 필드에 추가합니다.

linkingObjects() 메서드를 사용하면 자동차 제조업체를 찾을 수 있습니다. 이 메서드는 자동차에 연결된 객체의 결과 컬렉션을 반환합니다. 이 예시에서는 Sentra 자동차 모델을 만드는 제조업체가 한 곳뿐이므로 해당 제조업체의 이름은 Nissan이 될 것으로 예상할 수 있습니다.

특정 자동차를 만드는 제조업체를 찾으려면 다음 단계를 따르세요.

  1. 호출 linkingObjects()

  2. 매개변수로 제조업체 클래스 이름과 'cars' 필드를 전달합니다.

const getLinkedManufacturer = (car: LinkedCar): string => {
const manufacturer = car.linkingObjects<ToManyManufacturer>(
'ToManyManufacturer',
'cars',
)[0];
// Returns 'Nissan', as only one manufacturer is linked
// to this car object.
return manufacturer.name;
};

포함된 객체는 특정 객체에 대한 복잡한 데이터를 모델링하는 특수한 유형의 Realm 객체 입니다. 포함된 객체는 관계 와 유사하지만 추가 제약 조건을 제공하고 비정규화된 MongoDB document model 에 더 자연스럽게 매핑됩니다.

Realm은 내장된 객체를 하나의 특정 부모 객체 내의 중첩된 데이터로 취급하는 고유한 소유권 제약을 시행합니다. 내장된 객체는 부모 객체의 수명 주기를 상속하며 독립적인 Realm 객체로 존재할 수 없습니다. 다시 말해 내장된 객체는 기본 키를 가질 수 없으며 부모 객체가 삭제되면 Realm은 내장된 객체를 자동으로 삭제합니다.

재사용 및 구성 가능한 내장된 객체 유형

여러 부모 객체 유형에 하나의 내장된 객체 유형을 사용할 수 있으며 다른 내장된 객체 내에 객체를 포함시킬 수 있습니다. 자체 정의에서 내장된 객체 유형을 선택적 속성으로 재귀적으로 참조할 수도 있습니다.

참고

Realm은 내장된 객체에 계단식 삭제를 사용함

Realm 객체를 삭제하면 Realm은 해당 객체가 참조하는 모든 포함된 객체를 자동으로 삭제합니다. 상위 객체를 삭제한 후 애플리케이션에서 유지해야 하는 모든 객체는 대신 관계 를 사용해야 합니다.

내장된 객체를 정의하려면 embeddedtrue로 설정합니다. 관계를 정의하는 것과 같은 방식으로 부모 객체 유형에서 내장된 객체 유형을 참고할 수 있습니다.

class Manufacturer extends Realm.Object {
_id!: BSON.ObjectId;
name!: string;
cars!: Realm.List<CarWithEmbed>;
warranties!: Realm.List<Warranty>;
static schema: Realm.ObjectSchema = {
name: 'Manufacturer',
properties: {
_id: 'objectId',
name: 'string',
cars: 'CarWithEmbed[]',
// Embed an array of objects
warranties: 'Warranty[]',
},
};
}
class CarWithEmbed extends Realm.Object {
_id!: BSON.ObjectId;
model!: string;
miles?: number;
warranty?: Warranty;
static schema: Realm.ObjectSchema = {
name: 'CarWithEmbed',
properties: {
_id: 'objectId',
model: 'string',
miles: 'int?',
// Embed one object
warranty: 'Warranty?',
},
};
}
class Warranty extends Realm.Object {
name!: string;
termLength!: number;
cost!: number;
static schema: Realm.ObjectSchema = {
name: 'Warranty',
embedded: true,
properties: {
name: 'string',
termLength: 'int',
cost: 'int',
},
};
}

중요

내장된 객체는 기본 키를 가질 수 없습니다.

돌아가기

객체 모델 정의