4

学生とプロバイダーの 2 種類のユーザーを必要とする Web サイトを作成しています。従来の Java 設定では、ユーザー クラス (またはインターフェイス) を作成し、ユーザーから継承した 2 つのクラスを作成します。これは、「extends」および「with」修飾子を使用して、scala でも最高のコースですか? それが本当に最善の方法である場合(私はそう思う)、これをDBにマップする最良の方法は何ですか?「タイプ」列を保持してから、どちらかに設定するのが最善でしょうか?

2 番目の質問は、ビューを操作する方法です。表示は、ユーザーのタイプによって大きく異なるため、重要なルーティング ロジックが関与するか、少なくともビューのスニペットにロジックが組み込まれていると考えられます。

包括的な質問は次のとおりだと思います:これを行うための「好ましい」方法はありますか(レールのレシピなど)、それとも私は自分でやっているのですか?

ありがとう

4

1 に答える 1

8

それが本当に最善の方法である場合(私はそう思う)、これをDBにマップする最良の方法は何ですか?「タイプ」列を保持してから、どちらかに設定するのが最善でしょうか?

シナリオが与えられたデータベース構造を設計するための明確な「最良の方法」があるとは思いません。テキストブックの答えは、データベースの正規化DRYです。

3テーブルアプローチ

たとえば、両方のタイプのユーザーを含む User テーブルを作成し、共通の属性のみを保存し、User テーブルへの外部キーと特殊な属性がある場合は Student テーブルと Provider テーブルを作成する方法があります。これはおそらく、従来のリレーショナル データベース担当者が推奨するものではありませんが、OO 継承モデルにより近いものになります。

ワンテーブルアプローチ

あなたが言ったような別のアプローチは、「UserType」フィールドを作成し、両方のタイプのユーザーを User テーブルに格納することです。簡単ですが、リレーショナル データベースの参照整合性を利用する機会を逃してしまいます。たとえば、宿題などの Student のみに固有の子テーブルを作成する場合、学生とプロバイダーの両方が User テーブルに存在する場合、StudentID への外部キーを単純に作成することはできません。

2 つのテーブル アプローチ

オブジェクト リレーショナル マッピング フレームワークを使用している場合、おそらく最も簡単な方法は、オブジェクトの世界で必要なものを正確にデータベースにマッピングすることです。データベースには、Student テーブルと Provider テーブルがあり、2 つの共通性を特性として表現します。 Scala側で。

Liftチートシートを見つけました:

モデルの定義

リフト OR マップ モデルは、フィールドを持つクラスに基づいて定義されます。

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

Models の基本特性を共有することについての議論。

スレッドで David Pollak は次のように書いています。

あなたは Scala マジックを探しています:

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]
于 2009-10-03T02:08:22.670 に答える