テーブルが1つしかない場合でも、ページネーションとフィルタリングは実行可能ですよね?
ですから、問題はマイクロサービス間のテーブルを結合する方法だと思います。
マイクロサービスを使用する人は、マイクロサービス間のテーブルの結合をできるだけ避けると思います。できない場合は、テーブルを異なるマイクロサービスに分割するべきではありません。
一方、目標を達成するためにテーブルを結合する必要がない場合もあります。たとえば、次の 2 つのテーブルがあるとします。
-- from hotel information service
create table t_hotel (
id VARCHAR(40) not null,
name varchar(50) not null,
location varchar(50) not null,
CONSTRAINT pk_hotel PRIMARY KEY (id)
);
-- from hotel comment service
create table t_hotel_comment (
id VARCHAR(40) not null,
hotel_id varchar(40) not null,
content varchar(50) not null,
CONSTRAINT pk_hotel_comment PRIMARY KEY (id)
);
ここで、ホテル リストを表示するページを実装する必要があります。各行にコメント数が表示されます。
____________________________
| name | location | comments |
| foo | foooooo | 2 |
| bar | barrrrr | 3 |
----------------------------
結合クエリまたは 2 つの API 呼び出しを使用して実装することをお勧めします。
- ホテル情報サービスに電話して、ホテルを一覧表示します。
- ホテルごとに、ホテル コメント サービスに電話してコメントを集計します。
N+1 のパフォーマンスの問題について懸念がある場合は、コメント数を t_hotel にキャッシュすることができます。
-- from hotel information service
create table t_hotel (
id VARCHAR(40) not null,
name varchar(50) not null,
location varchar(50) not null,
comments numeric not null,
CONSTRAINT pk_hotel PRIMARY KEY (id)
);
ホテル コメント サービスは、コメントを受け取るたびに、HotelCommentedEvent を発行します。
HotelCommentedEvent {
"comment_id": "id",
"hotel_id": "foo",
"content": "bar"
}
また、ホテル情報サービスは、このイベントでキャッシュを更新します。したがって、単一のテーブル クエリでこの機能を実装できます。