関係 - C++ SDK
Realm では、リレーショナルデータベースとは異なり、関係を定義するために、ブリッジ テーブルや明示的な結合は使用されません。 Realm は、埋め込みオブジェクトまたは他の Realm オブジェクトへの参照プロパティを使用して関係を処理します。 これらのプロパティから直接読み取りと書込みを行います。 そのため、クエリ関係は、他のプロパティに対するクエリと同等のパフォーマンスが得られます。
関係タイプ
Realm は対 1 、対多、および逆の関係をサポートしています。 Realm では、埋め込みオブジェクトと呼ばれる特殊なタイプのオブジェクトも提供されています。これは概念としては関係に似ていますが、追加の制約を提供します。
対 1 の関係
対 1 の関係とは、あるオブジェクトが他の 1 つのオブジェクトに関連していることを意味します。 You define a to-one relationship for an object type in its object model. タイプが関連する Realm オブジェクトタイプであるプロパティを指定します。 たとえば、犬がお気に入りのオブジェクトと 1 対 1 の関係がある場合、
対多の関係
対多の関係とは、オブジェクトが複数の他のオブジェクトに関連していることを意味します。 Realm では、対多の関係は他のオブジェクトへの参照のリストです。 たとえば、人間が多数の犬を持っている場合があります。
2 つの Realm タイプ間の対多の関係は、リスト、マップ、またはセットとして表現できます。 リスト、マップ、およびセットは可変です。書込みトランザクション内で、これらのコレクション タイプに要素を追加および削除できます。 リスト、マップ、セットはクエリに関連付けられておらず、オブジェクトモデルのプロパティとして宣言されます。
逆の関係
Realm の関係定義は一方向です。 逆の関係は、オブジェクトを参照するオブジェクトにリンクします。
逆関係プロパティは、自動バックリンク関係です。 Realm は、対応する 対多リストまたは 1 つの関係プロパティでオブジェクトが追加または削除されるたびに、暗黙的な関係を自動的に更新します。 逆関係プロパティの値を手動で設定することはできません。
関係プロパティを宣言
To1 の関係の定義
対 1 の関係は、1 つのプロパティを別のオブジェクトタイプの 1 つのインスタンスにマッピングします。 たとえば、お気に入りの 1 つのみを持つ犬を 1 対 1 の関係としてモデル化できます。
関係フィールドを null に設定すると、オブジェクト間の接続が削除されます。 Realm は参照先のオブジェクトを削除しません。ただし、埋め込みオブジェクトでない限り、参照先のオブジェクトは削除されません。
重要
対 1 の関係は任意である必要があります
オブジェクトモデルで 1 の関係を宣言する場合、それは任意の プロパティである必要があります。 対 1 の関係を必要にしようとすると、Realm は実行時に例外をスローします。
struct FavoriteToy { realm::primary_key<realm::uuid> _id; std::string name; }; REALM_SCHEMA(FavoriteToy, _id, name) struct Dog { realm::primary_key<realm::uuid> _id; std::string name; int64_t age; // Define a relationship as a link to another SDK object FavoriteToy* favoriteToy; }; REALM_SCHEMA(Dog, _id, name, age, favoriteToy)
ToMany 関係の定義
対多の関係は、1 つのプロパティを別のオブジェクトタイプの 0 件以上のインスタンスにマッピングします。 たとえば、任意の数の従業員を持つ会社を対多の関係としてモデル化できます。
struct Company { int64_t _id; std::string name; // To-many relationships are a list, represented here as a // vector container whose value type is the SDK object // type that the list field links to. std::vector<Employee*> employees; }; REALM_SCHEMA(Company, _id, name, employees)
逆の関係の定義
逆の関係を定義するには、オブジェクトモデルで linking_objects
を使用します。 linking_objects
の定義は、反転する関係のオブジェクトタイプとプロパティ名を指定します。
この例では、 Dog
と 1 対 1 の関係を持つPerson
を定義します。 Dog
は、 owners
プロパティを通じてすべてのPerson
オブジェクトと逆の関係にあります。
struct Dog; struct Person { realm::primary_key<int64_t> _id; std::string name; int64_t age = 0; Dog* dog; }; REALM_SCHEMA(Person, _id, name, age, dog) struct Dog { realm::primary_key<int64_t> _id; std::string name; int64_t age = 0; linking_objects<&Person::dog> owners; }; REALM_SCHEMA(Dog, _id, name, age, owners)