代码之家  ›  专栏  ›  技术社区  ›  Eduard

在数据库中实现[用户订阅/订阅者]关系的最佳方法

  •  2
  • Eduard  · 技术社区  · 7 年前

    我正在编写一个使用Swift 4+Vapor框架、Fluent ORM和PostgreSQL作为驱动程序的服务器。我有一个用户模型,它应该有订阅者和订阅(这也是用户模型)。我有两个选择:1。存储具有唯一订阅/订阅者ID或2的阵列。建立一对多用户关系。你认为哪一个更好?我怎样才能实现它?

    1 回复  |  直到 7 年前
        1
  •  3
  •   tobygriffin    7 年前

    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")
      }
    }