2026年11月11日
自社製グループウェア「Ulala Hub」の開発ストーリー、2回目です。社内用に作ったものを、複数の会社で使えるサービスに作り直すとき、最初に決めなければならなかったのが「会社ごとのデータをどう分けるか」でした。
分け方は3つある
| 方式 | 中身 | 良い点・困る点 |
|---|---|---|
| 会社ごとに別のサーバー | 契約のたびに1台ずつ用意する | 完全に分かれるが、費用と管理の手間が会社の数だけ増える |
| 同じ表に「会社の番号」を付ける | 全社のデータを1つの表に入れ、番号で絞り込む | 作るのは簡単。ただし絞り込みを1か所でも書き忘れると、ほかの会社のデータが見える |
| データベースの中に会社ごとの区画を作る | 1つのデータベースの中を、会社ごとの区画(スキーマ)に分ける | プログラムは1つのまま、データは区画ごとに別。書き忘れで混ざることが構造上起きない |
Ulala Hub は3つ目を選びました。データベースは PostgreSQL、アプリは Python の Django で、会社ごとの区画の切り替えには django-tenants という仕組みを使っています。
アドレスで会社を見分ける
契約した会社には、会社ごとの専用アドレス(サブドメイン)を用意します。利用者がそのアドレスを開くと、システムはアドレスから会社を判断し、その会社の区画だけを見る状態に切り替えてから処理を始めます。プログラムの側は「今どの会社か」を意識せずに書けます。
区画は2種類あります。
- 共通の区画:運営用。会社の一覧、申込みの受付、契約の状態を持ちます。
- 会社ごとの区画:その会社の社員、予定、掲示板、伝言、文書を持ちます。
ログイン情報も会社ごとに別にした
利用者のIDとパスワード、ログイン中の状態も、会社ごとの区画に入れています。A社のIDでB社のアドレスに入ることはできません。同じメールアドレスの人が2つの会社に所属していても、それぞれ別の利用者として扱われます。
アップロードされた文書ファイルも、会社ごとに別の置き場所に保存しています。
はまったところ
- 共通の区画から、会社の機能を呼ぶと落ちる:予定や掲示板の表は会社ごとの区画にしかありません。運営用の画面から同じ部品を使おうとすると「表が無い」というエラーになります。共通の区画と会社の区画で、使う機能をはっきり分ける必要がありました。
- 画面の行き先も2系統になる:運営用のアドレスと会社用のアドレスでは、使える画面の一覧が違います。片方にしか無い画面へ転送しようとして、行き先が見つからないことがありました。
会社が増えても作業が増えないようにする
申込みから利用開始までは、人の手を入れずに進みます。
- 会社名、希望するアドレス、管理者の名前とメールを入力する。
- 確認メールのリンクを開くと、その会社の区画が作られ、アドレスが登録され、管理者が作られ、お試しが始まる。
- 「準備ができました」のメールからパスワードを設定して、ログインする。
通信の暗号化に使う証明書は、すべてのサブドメインに使える種類(ワイルドカード証明書)を自動更新にしています。会社が1社増えるたびに証明書を取り直す、という作業はありません。
まとめ
「気をつけて絞り込む」ではなく「混ざらない構造にする」。作る手間は増えますが、サービスとして預かる以上、ここは最初に決めておいて良かった点です。次回は、月額課金の仕組みを書きます。


