11

架空の例として、モデル TodoItem とモデル TodoList があります。TodoList には TodoItem の順序付きリストがあり、任意の TodoItem は任意の数の TodoList (多対多) に属することができます。TodoList 内の TodoItem の順序以外に、それらの関係について他の情報を保存する必要はありません。これをデータ ストアで表現する最良の方法は何ですか?

これを実装するには 2 つの方法があります - TodoList クラスに TodoItem を参照する db.Key の ListProperty を与えます。

class TodoList(db.Model):
  items = db.ListProperty(db.Key)

または、注文情報も含む ListItem モデルを作成します。

class TodoListItem(db.Model):
  item = db.ReferenceProperty(TodoItem)
  list = db.ReferenceProperty(TodoList)
  order = db.IntegerProperty()

モデルを非正規化することで後でこれを最適化することは間違いありませんが、事前最適化では、1 つの表現が他の表現よりも優れていますか?

4

3 に答える 3

10

これは、いくつかの要因によって異なります。

  • 順序以外のリレーション自体に関する情報を保存する必要がありますか? たとえば、注文と製品の間の多対多では、各製品の数量を保存する必要があります。
  • 1000 を超えるアイテムをリレーションの「小さい」カーディナリティに関連付ける必要がありますか (例: 1000 以上の todo アイテム、または 1000 以上のリスト)。
  • 通常、関連付けられているすべてのアイテムを一度に取得しますか?それとも、より選択的に取得したいですか?

追加の情報が必要な場合、関連付けに多くの要素がある場合、またはそれらの一部のみを取得する必要がある場合は、関係エンティティを選択することをお勧めします。他の状況では、リストの方が簡単かつ高速です。Todo リストの場合、キーのリストが最適な方法であると言えます。

于 2009-09-04T09:14:28.760 に答える
1

正規化を推進しているリレーショナルコンテキストを除いて(もちろん、リレーショナルの場合はかなりお勧めです!)、個別のTodoListItem「リレーションクラス」は私には少しやり過ぎのように見えます。問題とそれをコーディングする方法についての理由。ただし、最適化に関しては、アイテムが含まれているすべてのリストを簡単に見つけることができます。

于 2009-09-04T02:01:13.377 に答える
0

TodoListItem が複数の TodoList に属することができることを考えると、項目が属する各リストに対して機能する単一の order プロパティを持つことが有効であるかどうかが心配です。Item には、それが属するリストごとに Order が必要だと思います。

于 2009-12-22T19:58:29.627 に答える