在数据库

时间:2017-11-20 20:53:33

标签: swift postgresql orm vapor

我正在使用Swift 4 + Vapor框架,Fluent ORM和PostgreSQL作为驱动程序编写服务器。我有一个用户模型应该有订阅者和订阅(也是用户模型)。我有两个选择:1。存储具有唯一ID订阅/订阅者的数组或2.构建一对多用户 - 用户关系。你觉得哪一个更好,我怎么能实现呢?

1 个答案:

答案 0 :(得分: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")
  }
}