2017-11-20 18 views
2

私はSwift 4 + Vaporフレームワーク、Fluent ORM、およびPostgreSQLをドライバとして使用してサーバを作成しています。私は、購読者と購読(ユーザーモデルでもあります)を持つべきUser Modelを持っています。私はここで2つのオプションがあります:1.サブスクリプション/サブスクライバの一意のIDを持つ配列を格納するか、または2. 1対多のユーザーとユーザーの関係を構築します。どちらが良いと思いますか?どのように私はそれをimpemplementすることができますか?データベースの[ユーザ - サブスクリプション/サブスクライバ]リレーションを実装する最良の方法

答えて

3

アレイの格納は最適ではありません。すべてのユーザーのサブスクライバーを見つけるためにデータベースを照会するには、すべてのユーザーのサブスクリプション配列を解析し、ターゲットのユーザーIDを含むものを見つける必要があります。関係は良いアイデアです。

Fluentは、多対多関係をモデル化するためにPivotクラスを使用します。自己参照関係であるため、IDキーの競合を避けるために、独自の「スルー」モデルを作成するのが最も簡単です。

import FluentProvider 
import Vapor 

final class Subscription: Model, PivotProtocol { 

    typealias Left = User 
    typealias Right = User 

    var subscriberId: Identifier 
    var subscribedId: Identifier 

    init(
    subscriberId: Identifier, 
    subscribedId: Identifier 
) { 
    self.subscriberId = subscriberId 
    self.subscribedId = subscribedId 
    } 

    let storage = Storage() 

    static let leftIdKey = "subscriber_id" 
    static let rightIdKey = "subscribed_id" 

    init(row: Row) throws { 
    subscriberId = try row.get("subscriber_id") 
    subscribedId = try row.get("subscribed_id") 
    } 

    func makeRow() throws -> Row { 
    var row = Row() 
    try row.set("subscriber_id", subscriberId) 
    try row.set("subscribed_id", subscribedId) 
    return row 
    } 

} 

extension User { 
    var subscribers: Siblings<User, User, Subscription> { 
    return siblings(localIdKey: "subscriber_id", foreignIdKey: "subscribed_id") 
    } 
    var subscribed: Siblings<User, User, Subscription> { 
    return siblings(localIdKey: "subscribed_id", foreignIdKey: "subscriber_id") 
    } 
} 
+0

すばらしく詳細な回答をいただきありがとうございます。私はそれが良い出発点だと思う^‿^ – Edward

関連する問題