24879


Realmで一対多の構図のデータ構造を作ろうとしているのですが、その説明の中で出てくる、LinkingObjectsが果たして私の場合に必要なのかが分かりません（利便性が分かりません）  
多対多の関係ならば、まだ必要性はわかるのですが‥‥  
一対多の関係で、LinkingObjectsが活用できる事例があれば、どのようなものがあるか教えていただけたら幸いです。


CC BY-SA 3.0
2016-05-15T08:26:00.240
24875
2016-05-15T12:20:25.723
2016-05-15T11:49:25.180
5519
15418
question
realm
RealmのLinkingObjectsについて


LinkingObjectsは逆方向の関連を簡単に取得したいときに使います。必ず使うものではないので、現状のモデルで、使わずにうまくいってるのであれば、無理に使う必要はありません。

逆方向の関連を使って１対多の関連を表現するには、正方向の関連は１対１になりますが、逆方向の関連の有無にかかわらず、１対１の関連というのは、あまり使われるものではないので、まず最初にわかりやすく1対多の関連で説明します。

ブログ（`Blog`）とタグ（`Tag`）という２つのテーブルがあり、ブログ記事をタグで分類できるという機能があるとします。タグには複数のブログを関連づけることができます。あるタグが付いているブログを表示するのはタグを取得して関連(`blogs`)を辿るだけです。

[code]

    class Tag: Object {
        dynamic var name = ""
        let blogs = List<Blog>()
    }
    
[/code]

逆に、ブログ記事にどのタグが付いているか、ということを表示したい場合もあります。  
そのような場合に、下記のように逆方向の関連（`tags`）を設定しておけば、この関連の情報を使うだけでいいのでとても簡単です。

[code]

    class Blog: Object {
        dynamic var title = ""
        let tags = LinkingObjects(fromType: Tag.self, property: "blogs")
    }
    
[/code]

上記が逆方向の関連を用いて多対多を表現する例です。

１対１の関連（逆方向の関連を使って１対多になる）の例を無理やり挙げると、ユーザー（`User`）とプロフィール（`Profile`）というテーブルがあるとします。

１対１の関連は、通常１つのテーブルにできますが、カラムが多くなってきた場合など管理上の都合で分けることもあります。そのような例だと思ってください。

[code]

    class User: Object {
        dynamic var id = ""
        dynamic var name = ""
        var profile: Profile?
    }
    
[/code]

ユーザーには１つのプロフィールが対応します。プロフィールの側から、ユーザーのデータも参照したい、というときに逆方向の関連を使用します。

[code]

    class Profile: Object {
        dynamic var name = ""
        let users = LinkingObjects(fromType: User.self, property: "profile")
    }
    
[/code]

まとめますと、逆方向の関連を使わずに困っていないなら無理に使う必要はありません。

多対多の関連は、手作業で整合性をとるのは大変なので、逆方向の関連（`LinkingObjects`）をうまく使うと簡単に表現できます。

逆方向の関連を使って１対多になるような関連は、そもそも１対１の関連というものがあまり使われるものではないので、使っていなくてもまったく問題ありません。


CC BY-SA 3.0
2016-05-15T12:20:25.723
24879
2016-05-15T12:20:25.723
5519
24875
answer