hasManyまたはbelongsToプロパティを使用せずに、3NFを使用して多対多のマッピングをgrailsに実装しています。
この記事から抜粋して、その利点について多くのことを示し、説明しています。
記事: http: //burtbeckwith.com/blog/?p = 169
プレゼンテーションノート: http: //burtbeckwith.com/blog/files/169/gorm%20grails%20meetup%20presentation.pdf
私はこのような質問にタグシステムを作ろうとしています(stackoverflow :))
質問とタグを保存してから、それらとの関連付けを保存できますが、タグを使用して完全な質問を検索して提供できるようにしたいと思います。
質問、タグ、質問タグの3つのドメインクラスがあります
class Question {
String title
String content
Date createdAt
String tags
static transients = ['tags']
}
タグクラス
class Tag {
String name
static constraints = {
name(blank: false, maxSize: 40)
name(unique: true)
}
}
QuestionTagクラス
class QuestionTag implements Serializable{
Question question
Tag tag
static mapping = {
table 'question_tags'
version false
id composite: ['question', 'tag']
}
これらは、3つの正規化された形式で3つのテーブルを生成します
作品、質問、タグの数を保存します。
def question = new Question()
question.properties = params
question.save()
def tags = question.tags
tags.split(' ')?.each { tagName ->
Tag tag = Tag.findByName(tagName) ?: new Tag(name: tagName).save()
QuestionTag questionTag = new QuestionTag(question: question, tag: tag)
QuestionTag.save(flush: true)
}
Q.1「質問」とその「タグ」のセットをロードするにはどうすればよいですか?質問に関連付けられたタグが5つある場合。
ここで「searchable」プラグインをインストールし、「static searchable=true」を3つのクラスすべてに適用しました。しかし、そのプロパティをQuestionTagクラスに追加すると、コンパイルエラーが発生します。これは、「hasMany」の欠如に関係していると考えられます。
No converter defined for type [com.app.Question]
Q.2「hasMany」を追加すると、内部で別のテーブルが生成されますが、独自のテーブルを定義しました。それとも、私が作成したQuestionTagテーブルを参照しますか?
Q.3 3NFを使用すると、タグと質問の全文を検索して、タグまたはテキストに一致する検索キーワードに関連付けられた質問を返すことができます。