Amazonの商品を格納するデータベース設計の紹介です。
AmazonAPIを使ったWebサービスを作る時の参考になれば幸いです。
今回は以下の2つを紹介していきます。
- Amazonの商品情報をどのようにデータベースへ保存するか
- UI側でどのように表示させるか
テーブル設計
- id
- maker_id
- asin(例:B00AROMMFA)
- ean(例:0021112435085)
- amazon_detail_page_url
- title(例:【国内正規品】SteelSeries QCK heavy マウスパッド)
- name(QCK heavy)
- price
- amazon_image_id
メーカー名
- maker_id
makersというテーブルにカテゴリーとメーカーを保存しておきます。idとnameカラムからなる単純なテーブルです。
メーカー名はAmazonAPIのレスポンスに含まれています。
ASINとEAN
- asin(例:B00AROMMFA)
- ean(例:0021112435085)
ASINはAmazonのユニークな商品コードです。
※.co.jp
や.com
など、別リージョンでは使えないです。
EANは日本で最も普及している商品識別コードです。私は使っていませんが、一応データベースへ保存しています。
ASINの用途
- Amazonへのリンク生成
- AmazonAPIを使った商品価格の更新など
以下のように、ASINから簡単にAmazonへのリンクを生成できます。
https://www.amazon.co.jp/dp/B0160USMW6
アフィリエイトリンクにする場合には?tag=myapp-22
のようにパラメーターを付ければ良いのですが、それだとAmazonのAPI規約の「APIから取得したURL経由での売上がまったく無い場合、30日ごとに1日あたりのリクエスト数上限を0.1ずつ減少」という項目に引っ掛かってしまいます。
そのため、API取得時に返ってきた商品リンクをamazon\_detail\_page_url
カラムに保存するようにします。
参考:Product Advertising API (PA-API) の利用ガイドライン
商品タイトル
- title(例:【国内正規品】SteelSeries QCK heavy マウスパッド)
- name(QCK heavy)(nullable)
ユーザーへのタイトル表示
APIから取得した商品名を生のまま表示するのはダサいです。
(例:【国内正規品】SteelSeries QCK heavy マウスパッド 63008)
そのため、メーカーのnameカラムと組み合わせて商品名を表示するようにしています。
例えばSteelSeries
というメーカー名と、nameカラムのQCK Heavy
と組み合わせてSteelSeries QCK Heavy
のように表示します。
私の場合、このnameカラムはサイト管理者が自由に編集できるような仕組みにしています。
ユーザー側で個別のタイトルを用いたい場合
もし各商品をユーザーと紐付けるようなサービスの場合、ユーザーが個別のタイトルを持ちたいかも知れません。その場合はユーザーとの中間テーブルなどにユーザーが自由に編集できる新しいカラムを作ります。
タイトル表示の優先順位としては以下のようになります。
- ユーザーが設定した商品名(中間テーブルのカラム)
- maker.name + name
- title
商品価格
- price(unsigned int型)
定期的にAPIで自動更新しています。(ついでにtitleカラムなども)
商品イメージ
- amazon_image_id(例:31SdYqkJNEL)
Amazonには商品イメージにIDっぽいものが存在します。この値自体はAPIの戻り値にありませんが、商品の画像リンクからIDを抜き出し、それをカラムに保存しておけば活用できます。
https://images-fe.ssl-images-amazon.com/images/I/{$amazonImageId}._SL{$size}_.jpg
https://images-fe.ssl-images-amazon.com/images/I/31SdYqkJNEL._SL120_.jpg
上のURLように、商品イメージの横幅を自由に指定できます。おそらくリクエスト時に画像を動的にリサイズして、それをCDNに保存しているのだと思われます。
以上がAmazonの商品を保存するデータベース設計です
AmazonのAPIは回数制限に余裕があるにも関わらずリミットエラーが返ってきたり、JSONではなくXMLだったりと少々不便な面がありますが、やはり商品のアフィリエイトとしては非常に強いです。
上手く使いこなしていきましょう。