これまでのシナリオで実装された AdminService により、基礎となるデータモデルが 1:1 で公開されます。このようなサービスはかなりまれです。代わりに、サービスでは、特定の使用ケースに合わせて調整された非正規化ビューが公開されることがよくあります。以下の例を見てみましょう。
書店アプリケーションで使用するために、ドメインモデルの本と著者を公開する CatalogService をモデル化します。つまり、このサービスは、カタログユーザが書籍とその著者にアクセスし、注文できるようにすることを目的としています。
現在作成している新しいサービスは、CAP プロジェクトの srv フォルダにも定義されています。これには、cat-service.cds ファイルを使用します (以下の図を参照)。

最初に、AdminService の場合とまったく同じ方法で処理を行います。ファイル db/schema.cds から名称領域接頭辞 com.sap.learning のすべての定義をインポートし、インポートされた定義に対してローカルエイリアス db を設定します (1 行目)。
3 行目から 31 行目には、公開されたエンティティのコレクションとして CatalogService と呼ばれるサービスインターフェイスを定義する service ブロックが含まれます。@path アノテーションは、サービスにアクセスするための URL パス /cat を指定するために使用されます。
CatalogService では、基礎となるドメインモデルからのエンティティで射影として定義された 2 つのエンティティが公開されます。行 5ff は Books というエンティティを宣言します。これは、インポートされたドメインモデルで定義された Books エンティティのビューです。したがって、Authors エンティティは 18ff 行目で、ドメインモデルの Authors エンティティに対する射影として宣言されます。
CatalogService の Authors エンティティについては、後で詳しく説明します。まず、ブックエンティティについて詳しく見ていきましょう。
基礎となるドメインエンティティを 1:1 で公開する AdminService の Books エンティティとは対照的に、CatalogService の Books エンティティは明示的な select 句を使用します。つまり、select 句に明示的にリストされているもののみが公開されます。
いわゆるパス式を select 句で使用して、アソシエーションまたは構造化エレメント (もしくはその両方) に沿ってナビゲートすることができます。
この例では、Books モデルエンティティの author アソシエーションを使用して作成者名にアクセスします。このアソシエーションは、select 句にライタとして含まれています。
また、publicCountry は Books モデルエンティティで定義されたアソシエーションです。これは、Books エンティティを sap.common.Countries コード一覧に関連付けるために使用されます。この例では、このコード一覧の国名がpublicCountry として select 句に含まれています。
ブックドメインエンティティの価格要素には、構造化データ型があります。このタイプの 2 つのコンポーネントの金額と通貨も、対応するパス式を介して select 句に含まれます。

