8

Elasticsearchでは、ドキュメント間に子/親の関係を持たせることができることを私は知っています。

次に、インデックスを作成するときに、子と親のドキュメントがリンクされるように親IDを渡すことができます。

$ curl -XPUT localhost:9200/blogs/blog_tag/1122?parent=1111 -d '{    "tag" : "something"}'

とにかくelasticsearchで多対多の関係をモデル化することはできますか?

データは、次のスキーマを持つMySQLデータベースに存在します。

account
========
id
name
some_property

group
========
id
name
description

account_group
=============
account_id
group_id
primary_group //This is 1 or 0 depending on whether the group is the primary group for that account.

これは現在私のマッピングですaccount(配列表記を失礼します。PHPでElasticaを使用してelasticsearchサーバーと通信しています):

**Mapping for account**

'name' => array(
    'type' => 'string'),

'some_property' => array(
    'type' => 'string'),

'groups' => array(
   'properties' => array(
    'id'      => array('type' => 'integer'),
    'primary' => array('type' => 'boolean')
    )
),

**Mapping for group**

'name' => array(
        'type' => 'string'),

'description'=> array(
        'type' => 'string')

このアプローチの問題は、グループがインデックスから削除された場合、各アカウントを調べて、各アカウントからグループIDを削除する必要があることです。これは私には少し非効率的なようです。また、elasticsearchの子/親の関係を使用する場合、これは問題にならないだろうと思います。

とにかくelasticsearchで多対多の関係をモデル化する方法はありますか?

4

2 に答える 2

12

多対多の関係をモデル化する方法はありません。

唯一の方法は、上記のように各グループのIDを各アカウントに保存することです。

Elasticsearchは非常に効率的であるため、多くの場合、インデックスの再作成は許容できるソリューションです。また、elasticsearchにはドキュメントの概念があり、リレーショナルストレージシステムではないため、多対多の関係はおそらく実装されません。

于 2012-08-10T09:07:15.817 に答える
0

効率について考えるとき、考慮する必要があるのは、書き込み時間と読み取り時間の効率です。リレーショナルデータベースは書き込み時の効率を優先し、NoSQLは読み取り時の効率を優先します。

アプリケーションでの読み取りと書き込みの比率を慎重に検討し、全体として何がより効率的かを判断する必要があります。結局、データが書き込まれるとき、またはデータが読み取られるときのいずれかで、何かがすべての関係を結合する作業を行う必要があります。

于 2013-11-14T00:43:48.060 に答える