문제

학생과 제공자라는 두 가지 유형의 사용자가 필요한 웹 사이트를 만들고 있습니다. 기존의 Java 설정에서 사용자 클래스 (또는 인터페이스)를 작성한 다음 사용자로부터 상속 된 두 개의 클래스를 만듭니다. "확장"과 "수정 자와" "를 사용하여 스칼라에서도 가장 좋은 과정입니까? 그것이 실제로 가장 좋은 방법이라면 (내가 생각하는 것은) DB에서 이것을 매핑하는 가장 좋은 방법은 무엇입니까? "타입"열을 유지 한 다음 하나 또는 다른 사람으로 설정하는 것이 가장 좋습니까?

두 번째 질문은보기로 작업하는 방법입니다. 디스플레이는 어떤 유형의 사용자 유형에 따라 디스플레이가 매우 다르므로, 시야에 스 니펫에 내장 된 심각한 라우팅 로직 또는 최소한 논리가있을 것입니다.

나는 가장 중요한 질문은 다음과 같습니다.이 작업을 수행하는 "선호하는"방법이 있습니까 (레일이나 그와 같은 레시피와 같이), 또는 내가 혼자서 나가는가?

감사

도움이 되었습니까?

해결책

그것이 실제로 가장 좋은 방법이라면 (내가 생각하는 것은) DB에서 이것을 매핑하는 가장 좋은 방법은 무엇입니까? "타입"열을 유지 한 다음 하나 또는 다른 사람으로 설정하는 것이 가장 좋습니까?

시나리오가 주어진 데이터베이스 구조를 설계하는 "가장 좋은 방법"이 분명하다고 생각하지 않습니다. 교과서 답변은입니다 데이터베이스 정규화 그리고 마른.

3 개의 테이블 접근

예를 들어 한 가지 방법은 두 유형의 사용자를 포함하는 사용자 테이블을 만들고 공통 속성 만 저장하고 사용자 테이블에 대한 외국 키와 특수한 속성에 대한 외국 키가있는 학생 테이블 및 제공자 테이블을 작성하는 것입니다. 이것은 아마도 전통적인 관계형 데이터베이스 사람이 권장하는 것이 아니지만 OO 상속 모델에 더 가깝게 매핑됩니다.

하나의 테이블 접근법

당신이 말한 것과 같은 또 다른 접근법은 단지 "사용자 유형"필드를 만들고 두 유형의 사용자를 사용자 테이블에 저장하는 것입니다. 간단하지만 관계형 데이터베이스의 참조 무결성을 활용할 수있는 기회를 놓치게됩니다. 예를 들어, 숙제와 같이 학생과 관련된 어린이 테이블을 만들려면 학생과 제공자가 사용자 테이블에 살았을 때 단순히 학생에게 외국 열쇠를 만들 수는 없습니다.

두 개의 테이블 접근

객체 관계 매핑 프레임 워크를 사용하는 경우 가장 쉬운 방법은 객체 세계 해협에서 원하는 것을 데이터베이스에 정확하게 매핑하는 것입니다.이 데이터베이스는 학생 테이블과 공급자 테이블을 갖는 것입니다. 스칼라 쪽에서.

나는 리프트를 찾았다 컨닝 지:

모델 정의

리프트 또는 매핑 된 모델은 필드가있는 클래스를 기반으로 정의됩니다.

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

가질에 대한 토론 모델의 공유 기본 특성.

스레드에서 David Pollak은 다음과 같습니다.

당신은 스칼라 마법을 찾고 있습니다 :

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]
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top