商品の販売スケジュールを管理するテーブル設計パターン

商品とその販売スケジュールを管理するためのテーブル設計をするとき、販売スケジュールの情報を別テーブルに分離しておくと再利用性の高い作りに出来る場合があります。一つの設計パターンとしてメモしておきます。

例えば、以下の様な販売方法に対応したいとします。

  • 同時に複数の商品を販売する
  • 期間ごとに販売する商品の組み合わせ(商品セット)が異なる
  • 一度販売した商品の組み合わせは以降も使いまわす場合がある

つまりこういったケースです。

  • 1月に販売する商品
    • 商品A
    • 商品B
  • 2月に販売する商品
    • 商品C
  • 3月に販売する商品(1月の商品セットの使い回し)
    • 商品A
    • 商品B

テーブル設計例

products テーブル(商品)

  • id INT AUTO_INCREMENT
  • name VARCHAR COMMENT ‘商品名’

product_sets テーブル(商品セット)

  • id INT AUTO_INCREMENT
  • name VARCHAR COMMENT ‘商品セット名’
  • is_default BOOL COMMENT ‘基本商品セットフラグ’

product_set_relations テーブル(商品セットに属する商品)

  • id INT AUTO_INCREMENT
  • product_set_id INT
  • product_id INT

product_set_sale_schedules テーブル(商品セットの販売スケジュール)

  • id INT AUTO_INCREMENT
  • product_set_id INT
  • start_datetime DATETIME COMMENT ‘販売開始日時’
  • end_datetime DATETIME COMMENT ‘販売終了日時’

上記スキーマの解説

まず products テーブルに商品情報を持ちます。商品の種類の数だけレコードが出来ます。

そして複数の商品をまとめた商品セットを product_sets としてまとめ、その商品セットの販売期間の情報を product_set_sale_schedules に持つという構成です。

product_set_relations テーブルは多:多のリレーションを解消するための中間テーブルです。商品セットに属する商品一覧の情報を持ちます。

一度販売した商品セットは今後のスケジューリングでも使い回すことが出来ます。

もし期間に該当する商品セットがあった場合、それが優先して有効な商品セットとなりますが、該当するスケジュール情報が無かった場合は is_default が立っている基本商品セットが有効になります。こうしておくことで該当する販売スケジュールのデータが無かった場合のフォールバックが可能となり、常に何かを販売し続けることができます。(その必要が無ければ不要)

また、過去の販売スケジュールの履歴はスケジュールテーブルに蓄積して残すことが出来るため、後から過去の販売スケジュールを確認することができます。

今回の設計パターンについて補足

今回は少し要件が特殊だと思うので、実際には要件に合わせて構成を見なおした方がいいと思います。(設計パターンとか書いておいてすみません。)

例えば今回用いた「商品セット」という概念は、商品の組み合わせの再利用をしやすくする一方で、細やかな組み合わせの変更を難しくしています。

再利用されるケースが少ない場合は商品セットテーブルを無くしてしまい、商品ごとにスケジュールを設定する構成にしたほうが柔軟に対応できるでしょう。

「運用でカバー」は悲しい

運用でカバーという名のもと無駄なデータが生まれていくのは設計者として悲しいことです。

要件をよく確認して適切にテーブル設計をしていきたいものです。

Slackへのプルリクエスト通知に対応しました

以前ひそかに Bitbucket 上で Pull Request 作成やコメントをしたとき、任意の Chatwork グループチャットに通知するツール を作ったのですが、Slack チャットへの投稿にも対応しました。

上の画像が実際に Slack に通知されている場面のキャプチャ画像です。

最初は Slack 標準の外部サービス連携(Integration)でやればいいじゃん、と思ったのですが、世の中そんなに甘くなく、現状だと Bitbucket のプルリクエストの通知をサポートしていないようなのでそれを行うための補助ツールになります。

リポジトリは以下になります。

以下、つらつらと概要を書いていきます。
README.md に書いている内容とほぼ同じです。

対応しているチャットサービス

  • Slack
  • Chatwork

サポートしている通知の種類

次のプルリクエストに関するアクションをしたときにチャットへ通知されます。

  • プルリクエストの作成
  • プルリクエストのマージ
  • プルリクエストの更新
  • プルリクエストの取り下げ
  • プルリクエストに対してのコメント

簡単な通知フロー

  1. Bitbucket 上でプルリクエストの作成やマージなどを行う
  2. Bitbucket から指定した任意のサーバに対して hook post が飛ぶ
  3. 任意サーバ上のアプリケーション(今回のツール)が post を受け取り、任意のチャットサービスに通知メッセージをポスト

必要なもの

  • PHP 5.3+ (with cURL & composer)
  • Chatwork の API トークン (Chatwork に通知する場合)
  • Slack の API トークン (Slack に通知する場合)
    • トークンは Slack API のページで発行できます。
  • Bitbucket のリポジトリ (要 Admin 権限)

インストール方法

  1. Github からソース一式ダウンロード
  2. 任意サーバにソースアップロード
  3. パーミッションの修正
    • chmod -R 777 tmp
  4. 設定ファイルの配置と設定
    • Chatwork の場合:
      • cp config/chatwork.json.default config/chatwork.json
      • vim config/chatwork.json
    • Slack の場合:
      • cp config/slack.json.default config/slack.json
      • vim config/slack.json
  5. Composer で必要プラグインインストール
    • composer install
  6. Bitbucket のリポジトリ設定から Pull Request POST の hook url 設定
    • Chatwork の場合の例:
      • http://example.com/bitbucket_event_notification/gateway.php?destination_service=chatwork&room_id=1000000000
    • Slack の場合の例:
      • http://example.com/bitbucket_event_notification/gateway.php?destination_service=slack&room_id=C1234567890

gateway.php が受け付ける GET パラメータ一覧

キー 説明 Chatwork の場合の値の例 Slack の場合の値の例
destination_service 通知先チャットサービス chatwork slack
room_id 通知先のチャットルームID (チャンネル) 1000000000 #bitbucket, C1234567890
  • room_id の指定に # が含まれる場合は URL エンコードが必要
    • 例: #bitbucket -> %23bitbucket

個人的な事情など

普段メインで使うチャットが Chatwork から Slack に変わった関係で Chatwork のほうの動作確認が手薄になってます。もし不具合などあればコメント or PR お待ちしてます。

また、プルリクエストのマージ、更新、取り下げの際に Pull Request へのリンクが無いのは仕様となっています。Approve / UnApprove の hook request に至っては、「どれかのプルリクエストに対して Approve / UnApprove された」という情報しか分からないという謎仕様になっていて、あえて通知の実装をしていません :(

Bitbucket アカウントを持ってる人は是非 issue にアクセスして vote をぽちっとお願いしますw
site / master / issues / #8340 – Pull Request POST hook does not include links to related objects (BB-9535) — Bitbucket

2015/08/19 03:19 – リポジトリの url が変更になったため更新しました。

PullRequestされたときChatworkに通知されるようにしてみた

Bitbucket 上で Pull Request やコメントをしたとき、任意の Chatwork グループチャットにポストしてくれるツールを作りました。

ソースは Github に。(Bitbucket 用のツールだけど)
https://github.com/ymm1x/BitbucketEventNotification

通知投稿されるタイミング

  • Pull Request を作成したとき
  • Pull Request にコメント、返信したとき(コードレビュー)
  • Pull Request を取り下げたとき
  • Pull Request をマージしたとき

通知表示のサンプル
(通知表示の例ですが一部塗りつぶしてあります。)

あまり多くの機能はつけていないので、運用してみつつ気が向いたときに欲しい機能を付け足していこうと思っています。

使用 API

作った経緯とか開発サイクルとか

今の携わっているプロジェクトでは A successful Git branching model に近いブランチ運用モデルを採用していて、ざっくり、以下のようなサイクルで開発しています。

  1. 開発用ブランチで開発やコード修正を行う
  2. Pull Request を作成し他のエンジニアがコードレビュー
  3. Pull Request の承認数 (Approval) が一定数に達したらメインブランチにマージ(祝)

最近の開発現場では割とありがちな流れだと思いますが、これまでの業務では開発が一段落して Pull Request を作成したことをチャットで毎回他のメンバーに知らせてレビューしてもらって…という流れがあったので、この流れをスムーズにできないかと思って作りました。

ちなみにこのツールは許可より謝罪な感じで、欲しいと思ってから上長に許可をとらずに作りました>< 最近、あったほうが便利だと思うものはすぐに作り始めるようにしています。

今日から実際に業務で使い始めてみてますが、便利ならそのまま使われるし、そうじゃなければ使われなくなるだけということで。

HipChat + hubot とかならもっと楽に実現できるのかな?

2015/08/19 03:21 – リポジトリの url が変更になったため更新しました。