オンライン コンテンツのプラットフォームを構築します。このシステムには、基本的にコンテンツとタグの 2 つのエンティティがあります。タグは、多対多の方法でコンテンツに関連付けられます。
SQL データベースを使用すると、次のようにモデル化されます。
コンテンツ 1-----* TC *-----1 タグ
このモデルを考えると、次のようなクエリを作成する必要があります。
1) ID でコンテンツを取得する
2) 1 つのタグでコンテンツを取得する - 「すべての MATH* コンテンツを一覧表示する」
(※)MATHはタグです
3) 複数のタグでコンテンツを取得 - 「すべての HARD* MATH* コンテンツを一覧表示」
4) 上記のデータをコンテンツ属性でフィルタリングします。 - 「先週作成されたすべての HARD* MATH* コンテンツを一覧表示する」
1 と 2 はほとんど問題になりませんが、3 と 4 は難しいと思います。
リレーショナルの世界では、クエリ (4) の場合、次のように、CONTENT から開始して TC と複数回結合できます。
select distinct(c.*) from CONTENT c, TC tc1, TC tc2
where tc1.content_id = c.id
and tc2.content_id = c.id
and tc1.id = <math_tag_id>
and tc2.id = <hard_tag_id>
and c.creation_date > <last_week>
しかし、次のような場合にうまくスケーリングできるかどうかはわかりません: - TC に大量のデータがある - 4 ~ 8 個のタグの共通部分をクエリする必要がある
これについて何か考えはありますか?
noSQL の世界で、これまでに使用したデータベースは BigTable だけです。私が知る限り、BigTable はこの問題に対する最良の選択ではないかもしれません。同じ「テーブル」を使用する場合、(3) については、おそらく (ndb + python を想定) のようなものを使用します。
tcs = TC.query(
TC.tag_key.IN([math_tag_key, hard_tag_key])
).fetch()
content_keys = [tc.content_key for tc in tcs]
distinct_content_keys = set(content_keys) //eliminate repeated values
contents = ndb.get_multi(distinct_content_keys)
しかし、
TC.tag_key.IN
4 ~ 8 個のタグを受け取ったときにこれがどれだけうまく機能するかはわかりません(これについて何か考えはありますか? )- CONTENT と結合できないため (4) のクエリを作成できません (BigTable は結合を行いません)。別の方法は、PITA である TC で CONTENT の属性を複製することです。( BigTable でこれを行うより良い方法はありますか? )
したがって、ここでのより大きな問題は、この問題を最もよく解決するデータベースはどれかということです。私は Graph データベースを調べて、これをどれだけうまく解決できるかを調べたいと思っていますが、それについては専門家の意見が必要だと思います。
グラフ DB は本当に進むべき道ですか? Neo4J は最良の選択肢ですか?