2

Go プログラミング言語で AppEngine のデータストア内で多対多の関係を表現する方法について頭を悩ませています。私は従来のリレーショナル データベースに慣れています。

私のシステムには 2 種類のエンティティがあります。Aそれらを と と呼びましょうB。すべてAのエンティティは、いくつかのBエンティティに関連付けられています。同様に、すべてのBエンティティは、他のいくつかのエンティティに関連付けられていAます。エンティティが与えられたすべてのエンティティ、およびBエンティティが与えられたすべてのエンティティを効率的にクエリできるようにしたいと考えています。AAB

ReferencePropertyPython SDK では、エンティティ内のフィールドが他のエンティティを参照する可能性があることに注意する方法があるようです。しかし、Go の AppEngine SDK で同様のものを見つけることができません。Go は、基本的なstructs を使用してエンティティを表すようです。

これに対処するためのベストプラクティスは何ですか?

4

2 に答える 2

1

クエリの方法に基づいて、次のことができます。

構造体 A にフィールドを追加します。

BIds []int64

構造体 B にフィールドを追加します。

AIds []int64

A と B の間にリレーションを追加するときはいつでも、対応する ID を 2 つの変数に追加するだけです。

この A1 に関連するすべての B に対してクエリを実行する必要がある場合は、次のようにクエリを実行します。

SELECT * FROM B where AIds = 'A1'

この B1 に関連するすべての A について、次のようにします。

SELECT * FROM A where BIds = 'B1'

更新:
Dragonx からの提案に基づいて変更されたクエリ

于 2013-06-28T19:15:33.950 に答える
1

Python ReferenceProperty は基本的に、別のエンティティへのキーを格納します。Go で Key フィールドを使用するのと似ています。

問題を解決するには、少なくとも 2 つの方法があります。限られた数の参照を保存するための安価な方法であり、より大きなデータセットには高価な方法です。

fmt.Println.MKO は安価な方法で答えを提供しましたが、クエリが彼の提案よりも単純であることを除いて、実際には次のようになります。

SELECT * FROM B where AIds = 'A1'

この方法は、エンティティごとのインデックス付きエントリ数とエンティティ サイズに制限されます。そのため、AId または BId のリストでは、エンティティの数が 20000 以下に制限されます。

非常に多くのデータがある場合、特定の A & B エンティティ間の M2M 関係を表すマッピング エンティティが必要になります。これには、A へのキーと B へのキーが含まれているだけです。次に、マップ エンティティをクエリし、必要な対応する A または B エンティティを取得します。これははるかにコストがかかりますが、エンティティ サイズの制限を超えています。

于 2013-06-28T19:31:56.747 に答える