【发布时间】:2017-11-12 23:19:32
【问题描述】:
我正在使用 play 2.6.6、scala 2.12.3 和 slick 3.0.0。
我最初有以下案例类结构,其中有一个嵌套案例类:
case class Device(id: Int, deviceUser: Option[DeviceUser] =None)
case class DeviceUser(name: Option[String] = None)
所以,我为设备类创建了以下投影:
class DevicesTable(tag: Tag) extends Table[Device](tag, "DEVICES") {
def id = column[Int]("ID", O.PrimaryKey)
def name = column[Option[String]]("NAME")
def deviceUser = name.<>[Option[DeviceUser]](
{
(param: Option[String]) => {
param match {
case Some(name) => Some(DeviceUser(Some(name)))
case None => None
}
}
},
{
(t: Option[DeviceUser]) =>
{
t match {
case Some(user) => Some(user.name)
case None => None
}
}
}
)
def * = (id, deviceUser).<>(Device.tupled, Device.unapply)
}
上述设置工作正常。我可以使用上述投影轻松存储和检索数据。 But now, my requirement has changed and I need to store list of nested case class。所以,类结构现在如下:
case class Device(id: Int, deviceUser: Option[List[DeviceUser]] =None)
case class DeviceUser(name: Option[String] = None)
有没有什么方法可以为 deviceUser: Option[List[DeviceUser]] 字段定义投影?
更新:我在这里寻找更多non-relational 方法。
【问题讨论】:
-
一个设备可以包含多个 DeviceUser - 因此您应该将其表示为数据库级别的一对多关系
-
是的,这将是一种关系方式。但是,我在这里寻找更多
non-relational的方法。 -
将其序列化为 JSON/XML 并将其保存在 BLOB 列中。您的 DAL 应该解析它并创建所需的类型。
-
这是一个很酷的想法,但我仍然希望数据在数据库中有意义
-
但是为了在数据库级别上有意义,它不应该是关系的吗?也许您可以使用 NoSQL,例如 MongoDB,但据我所知,Slick 中不支持 MongoDB。如果您需要 Slick 的一对多关系示例,我可以提供。