Frage

Ich erstelle eine Website, die zwei Arten von Benutzern benötigt: Studenten und Anbieter. In einer traditionellen Java-Einstellung würde ich eine Benutzerklasse (oder Schnittstelle) erstellen und dann zwei Klassen erstellen, die von dem Benutzer geerbt. Ist dies der beste Kurs auch in scala, mit dem „erweitert“ und „mit“ Modifier? Wenn dies tatsächlich der beste Weg ist (was ich vermute, es ist), was der beste Weg, dies in der DB abzubilden? Wäre es am besten einen „Typ“ -Spalte zu halten und dann haben sie auf die eine oder andere?

Die zweite Frage ist, wie mit dem Blick zu arbeiten. Auf dem Display wird sehr unterschiedlich sein, je nachdem, welche Art von Benutzer ist und so dar, dass ich wird es einige ernsthafte Routing-Logik oder zumindest Logik in Schnipsel in der Ansicht gebaut beteiligt sein.

Ich denke, die übergeordnete Frage ist: Gibt es einen „bevorzugten“ Weg, um dies zu tun zu gehen (wie ein Rezept in Schienen oder so), oder bin ich irgendwie auf meinem eigenen

?

Danke

War es hilfreich?

Lösung

  

Wenn dies tatsächlich der beste Weg ist (was ich vermute, es ist), was der beste Weg, dies in der DB abzubilden? Wäre es am besten einen „Typ“ -Spalte zu halten und dann haben sie auf die eine oder andere setzen?

Ich glaube nicht, dass es klar ist, „der beste Weg,“ Datenbankstruktur ein Szenario gegeben zu entwerfen. Das Textbuch Antwort ist Datenbank Normalisierung und DRY .

Drei Tische nähern

Eine Möglichkeit könnte zum Beispiel seiner Benutzertabelle zu erstellen, beiden Arten von Benutzern enthält, nur die gemeinsamen Attribute zu speichern und Schülertisch und Provider-Tabelle mit Fremdschlüssel auf Benutzertabelle und spezialisierte Attributen wenn überhaupt zu schaffen. Dies ist wahrscheinlich nicht das, was eine traditionelle relationale Datenbank Person würde empfehlen, aber es Karten näher an das OO-Vererbungsmodell.

Eine Tabelle Ansatz

Ein weiterer Ansatz wie Sie gesagt wäre, nur ein „Usertype“ Feld zu erstellen und speichern beide Arten von Benutzern in Benutzertabelle. Es ist einfach, aber Sie vermissen dann die Möglichkeit, die Vorteile der referentielle Integrität der relationalen Datenbank zu übernehmen. Zum Beispiel, wenn Sie sind untergeordnete Tabelle spezifisch nur für Schüler, wie Hausaufgaben zu erstellen, kann man nicht einfach Fremdschlüssel StudentID machen kann, wenn beiden Studenten und Anbieter in Benutzertabelle gelebt hat.

Zwei Tabellen nähern

Wenn Sie Object-Relational Mapping Framework verwenden, wahrscheinlich der einfachste Weg zu gehen, ist genau kartieren, was Sie in der Objektwelt in die Datenbank Straße wollen, der Schülertisch und Provider-Tabelle würde mit und drückt die Gemeinsamkeit in Scala Seite zwei als Merkmal.

Ich fand Aufzug Spickzettel :

  

Definition Modelle

     

lift O-R gemappt Modelle definiert sind basierend auf einer Klasse mit Feldern.

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

Diskussion auf, die gemeinsame Basiseigenschaften für Modelle .

In dem Thread David Pollak schreibt:

  

Sie sind für einige Scala Magie suchen:

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top