Device Sync를 통한 데이터 모델링 - Swift SDK
Realm 객체 모델
Realm 객체 를 정의하려면 객체 에서 클래스를 파생합니다. 각 모델을 정의하는 모델은 MongoDB Atlas 의 자체 컬렉션 에 매핑됩니다. 이 예시 에서는 Dog
와 Person
가 모두 MongoDB Atlas 의 별도 컬렉션에 매핑됩니다.
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" }
JSON Schema
Atlas App Services에 해당 스키마가 있는 경우 Device Sync는 Atlas에 동기화할 때 Realm Swift 데이터 유형을 BSON으로 자동 변환합니다. 클라이언트 기기가 Device Sync를 통해 App Services에서 데이터를 동기화하면 SDK는 BSON을 다시 Swift 객체로 변환합니다. Realm Mobile Sync를 사용하여 데이터를 동기화하는 대신 MongoDB Atlas 데이터에 직접 액세스 하여 이러한 객체를 쿼리하면 BSON 데이터 유형을 얻을 수 있습니다. MongoDB Data Access는 해당 Swift 객체에 자동으로 매핑되지 않습니다.
{ "title": "Dog", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "age": { "bsonType": "long" } } }
{ "title": "Person", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" } } }
Realm 관계
일대일 관계
위 예의 객체를 사용하여 Person
가 하나의 Dog
을 가질 수 있는 경우를 생각해 보세요. Dog
객체에 대한 선택적 링크인 Person
모델에 dog
속성을 추가할 수 있습니다. 대일 관계는 선택 사항이어야 합니다.
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" // To-one relationship var dog: Dog? }
JSON Schema
App Services 스키마에서 새 속성이 dog
필드로 변환되는 것을 볼 수 있습니다. 필드가 선택적 속성이므로 required
배열에 없습니다. 해당 유형은 objectId
Dog
별도의 Dog
collection에 있는 특정 객체에 연결되는 입니다. ObjectId는 Dog
모델의 기본 키이므로 두 객체를 연결하는 것은 필드입니다.
{ "title": "Person", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "dog": { "bsonType": "objectId" }, "name": { "bsonType": "string" } } }
Dog
스키마가 변경되지 않습니다. 이는 대일 관계이므로 단방향 관계입니다. Dog
은(는) Person
와(과) 관계가 없습니다.
To-Many 관계
위 예의 객체를 사용하여 Person
에 여러 개의 개가 있을 수 있는 경우를 생각해 보세요. Dog
객체의 목록인 Person
모델에 dogs
속성을 추가할 수 있습니다. 반려견이 없는 경우 이는 빈 목록입니다. 사람이 개를 가져오면 새 dog 객체를 만들어 사람의 dogs
목록에 추가할 수 있습니다.
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" // To-many relationship - a person can have many dogs var dogs: List<Dog> }
JSON Schema
App Services 스키마에서 새 속성이 dogs
필드로 변환되는 것을 볼 수 있습니다. 이 필드의 유형은 배열이고 배열의 항목은 objectId
유형입니다. 이는 Dog
모델의 기본 키를 objectId
으로 정의했기 때문입니다. 이 필드는 Person
객체와 관련된 모든 Dog
객체의 기본 키 배열입니다.
{ "title": "Person", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "dogs": { "bsonType": "array", "items": { "bsonType": "objectId" } } } }
역관계
위 예의 객체를 사용하여 Dog
객체가 Person
객체와 역관계를 가진 경우를 생각해 보세요.
class Dog: Object { true) var _id = ObjectId() (primaryKey: var name = "" var age = 0 // The backlink to the `Person` who has this `Dog`. "dogs") var person: LinkingObjects<Person> (originProperty: } class Person: Object { true) var _id = ObjectId() (primaryKey: var name = "" // To-many relationship - a person can have many dogs var dogs: List<Dog> }
JSON Schema
App Services 스키마에는 Dog
모델의 Person
에 대한 역관계를 나타내는 person
속성이 존재하지 않습니다. 역관계의 값을 직접 설정할 수 없으며 해당 관계는 Atlas에 존재하지 않습니다. 그러나 Realm은 Realm 객체 모델을 기반으로 클라이언트 애플리케이션에서 이러한 관계를 파생하고 업데이트합니다.
{ "title": "Dog", "bsonType": "object", "required": [ "_id" ], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "age": { "bsonType": "long" } } }
내장된 객체 모델
Realm Swift SDK로 포함된 객체를 정의하면 EmbeddedObject 에서 클래스를 파생합니다. 관계를 정의하는 것과 같은 방식으로 상위 객체 유형에서 포함된 객체 유형을 참조할 수 있습니다.
class Person: Object { true) var id = 0 (primaryKey: var name = "" // To-many relationship - a person can have many dogs var dogs: List<Dog> // Inverse relationship - a person can be a member of many clubs "members") var clubs: LinkingObjects<DogClub> (originProperty: // Embed a single object. // Embedded object properties must be marked optional. var address: Address? convenience init(name: String, address: Address) { self.init() self.name = name self.address = address } } class DogClub: Object { var name = "" var members: List<Person> // DogClub has an array of regional office addresses. // These are embedded objects. var regionalOfficeAddresses: List<Address> convenience init(name: String, addresses: [Address]) { self.init() self.name = name self.regionalOfficeAddresses.append(objectsIn: addresses) } } class Address: EmbeddedObject { var street: String? var city: String? var country: String? var postalCode: String? }
JSON Schema
내장된 객체는 상위 유형의 스키마에서 내장된 문서에 매핑됩니다. 이 동작은 자체 MongoDB 컬렉션에 매핑되는 일반 Realm 객체와 다릅니다.
{ "title": "Person", "bsonType": "object", "required": ["id"], "properties": { "id": { "bsonType": "int" }, "name": { "bsonType": "string" }, "dogs": { "bsonType": "array", "items": { "bsonType": "objectId" } }, "address": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } }
{ "title": "DogClub", "bsonType": "object", "required": ["_id", "name", "addresses"], "properties": { "_id": "objectId", "name": { "bsonType": "string" }, "members": { "bsonType": "array", "items": { "bsonType": "objectId" } }, "addresses": { "bsonType": "array", "items": { "title": "Address", "bsonType": "object", "properties": { "street": { "bsonType": "string" }, "city": { "bsonType": "string" }, "country": { "bsonType": "string" }, "postalCode": { "bsonType": "string" } } } } } }
객체 모델 및 스키마 만들기
Atlas 에서 SDK 객체 모델과 BSON 데이터를 매핑하려면 SDK 객체 객체 모델 과 일치하는 App Services 의 스키마 가 있어야 합니다. 일치하는 스키마 및 객체 모델을 생성할 수 있는 몇 가지 방법이 있습니다.
클라이언트 애플리케이션에서 객체 모델을 만들고 이 모델에서 App Services 스키마를 생성합니다.
App Services에서 스키마를 생성하고 스키마로부터 Realm 객체 모델을 생성합니다.
새 클라이언트 애플리케이션을 개발하는 경우 클라이언트 애플리케이션의 데이터 모델을 반복할 수 있습니다. Atlas App Services에서 개발 모드 를 활성화하여 백엔드가 클라이언트 객체 모델을 기반으로 스키마를 추론하고 업데이트하도록 합니다. 개발 모드는 호환성이 손상되는 스키마 변경 에는 작동하지 않으므로 SDK 데이터 모델을 손상시키는 변경을 수행할 때는 서버에서 기존 스키마를 제거 해야 합니다.
Atlas 에 이미 존재하는 데이터로 작동하는 클라이언트 애플리케이션 을 개발하는 경우 해당 데이터에서 스키마 를 생성 할 수 있습니다. 그런 다음 서버 측 스키마 에서 SDK 객체 모델을 생성 할 수 있습니다.