1

次のドメインクラスがあるとします。

class Post {
   SortedSet tags
   static hasMany = [tags: Tag]
}

class Tag {
   static belongsTo = Post
   static hasMany = [posts: Post]
}

これまでの私の理解では、aを使用するhasManyと休止状態のSetマッピングになります。ただし、一意性/順序を維持するために、Hibernateはデータベースからセット全体をロードし、それらのハッシュを比較する必要があります。

これにより、セットが大きくなった場合に投稿/タグを追加および削除すると、パフォーマンスに重大な問題が発生する可能性があります。この問題を回避するための最良の方法は何ですか?

4

3 に答える 3

1

デフォルトのマッピングでは、Hibernate/GORM によって保証される順序はありません。したがって、ソートを行うためにデータベースから要素をロードする必要はありません。たくさんの ID を手に入れることになりますが、それだけです。

19.5.2 を参照してください: http://www.hibernate.org/hib_docs/reference/en/html/performance-collections.html

一般に、Hibernate/GORM は予想よりも優れたパフォーマンスを発揮します。実際のパフォーマンスの問題を実際に証明できるまでは、フレームワークを信頼して心配する必要はありません。

于 2008-11-19T23:07:25.900 に答える
0

Grailsドキュメントが更新されたようです:

http://grails.org/doc/1.0.x/

セクション5.2.4では、コレクションタイプの潜在的なパフォーマンスの問題について説明します。

関連するセクションは次のとおりです。

コレクションの種類とパフォーマンスに関する注意

Java Setタイプは、重複を許可しないコレクションです。Setアソシエーションにエントリを追加するときに一意性を確保するために、Hibernateはデータベースからアソシエーション全体をロードする必要があります。アソシエーションに多数のエントリがある場合、これはパフォーマンスの点でコストがかかる可能性があります。

Hibernateは順序を維持するためにアソシエーション全体を順番にロードする必要があるため、リストタイプにも同じ動作が必要です。したがって、アソシエーションに多数のレコードが予想される場合は、アソシエーションを双方向にして、リンクを逆側で作成できるようにすることをお勧めします。たとえば、次のコードについて考えてみます。

def book = new Book(title:"New Grails Book")
def author = Author.get(1)
book.author = author
book.save()

この例では、関連付けリンクは子(Book)によって作成されているため、コレクションを直接操作する必要がないため、クエリが少なくなり、コードが効率的になります。多数の関連するBookインスタンスを持つ作成者がいる場合、次のようなコードを作成すると、パフォーマンスに影響があります。

def book = new Book(title:"New Grails Book")
def author = Author.get(1)
author.addToBooks(book)
author.save()
于 2008-11-20T02:10:19.260 に答える
0

セットの順序は、Set実装、つまりによって保証されSortedSetます。Listデータベースのインデックスを追跡する を使用しない限り、順序付けはサーバー側のみです。

ドメイン クラスが にある場合、セットの適切な並べ替えを有効にするためにSortedSet実装する必要があります。Comparable

パフォーマンスの問題は、それ自体の問題ではありません。単一Tagの にアクセスする場合は、そのIdで取得する必要があります。並べ替えられたタグが必要な場合は、並べ替えは、特定のタグではなく全体を見ている場合にのみ意味があるため、一度にTagsすべてを取得することになります。並べ替えはデータベース側ではなくサーバー側で実行されるため、 Db に関してはaと通常Tagsの違いはほとんどありません。SortedSetHashSet

于 2008-11-14T13:48:12.210 に答える