我创建一个网站,该网站将需要两种类型的用户:学生和供应商。在一个传统的Java设定我会创建一个用户类(或接口),然后创建从用户继承两个类。这是Scala当然最好也使用“扩展”和“与”修饰符?如果这确实是最好的方法(我怀疑它是),什么是最好的方式,在数据库映射呢?会是最好保持一个“类型”一栏,然后把它设置一个或其他?

第二个问题是如何与视图中工作。显示器将是非常不同,这取决于哪种类型的用户是一个,所以我图会有涉及一些严重的路由选择逻辑或至少逻辑内置到视图中的片段。

我想首要的问题是:是否有一个“首选”的方式去这样做(如在轨或配方一些这样的),还是我有种自己出去

由于

有帮助吗?

解决方案

  

如果这确实是最好的方式(我怀疑它是),什么是最好的方式,在数据库映射呢?会是最好保持一个“类型”列,然后把它设置为一个或另一个?

我不认为有明确的设计赋予了方案数据库结构“的最佳途径。”书中的文字答案是数据库规范化和的 DRY

三个表接近

例如一种方法可以创建包含两种类型的用户的用户表,只存储在公共属性,并创建学生表,并提供表外键的用户表,如果有专门的属性。这可能是不是一个传统的关系数据库的人会推荐,但它映射更接近OO继承模型。

一种表方法

像你另一种方法说是只创建一个“用户类型”字段,这两种类型的用户存储到用户表。这很简单,但你错过了拍到了关系数据库的引用完整性的优势。例如,如果您要创建仅针对学生子表,如家庭作业,你不能简单地做外键StudentID如果学生和提供商住在用户表。

两个表接近

如果您正在使用的对象关系映射框架,有可能去的最简单的方法就是准确映射你想要在对象世界海峡到数据库中,这将是有学生表和提供表和快速的共性两成Scala中侧性状。

我发现电梯欺骗片

  

定义模型

     

电梯O-R映射模型是基于与字段类定义

class WikiEntry extends KeyedMapper[Long, WikiEntry] {
  def getSingleton = WikiEntry // what's the "meta" object
  def primaryKeyField = id

  // the primary key
  object id extends MappedLongIndex(this)

  // the name of the entry
  object name extends MappedString(this, 32) {
    override def dbIndexed_? = true // indexed in the DB
  }

  object owner extends MappedLongForeignKey(this, User)

  // the text of the entry
  object entry extends MappedTextarea(this, 8192) {
    override def textareaRows  = 10
    override def textareaCols = 50
  }
}
  

论具有用于模型 共享基础性状

在该线程大卫波拉克写道:

  

您正在寻找一些斯卡拉魔法:

trait Posting[MyType <: Mapper[MyType]] { // Defines some common fields for posted user content 
  self: MyType => 
  def primaryKeyField = id 
  object id extends MappedLongIndex(this) 
  object creator extends MappedLongForeignKey(this, User) 
  object createdAt extends MappedLong(this) { 
    override def defaultValue = System.currentTimeMillis 
  } 
} 

class FooPosting extends KeyedMapper[FooPosting] with Posting[MyType]
scroll top