それが本当に最善の方法である場合(私はそう思う)、これを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]