コンテンツにスキップ

関係を描く

ほかに 28 言語で読めます

English · Español · Português (Brasil) · Français · Deutsch · Italiano · 한국어 · 简体中文 · Português (Portugal) · 繁體中文 · Bahasa Indonesia · Türkçe · Polski · Tiếng Việt · ไทย · Nederlands · العربية · עברית · Українська · हिन्दी · Русский · Svenska · Dansk · Norsk bokmål · Suomi · Español (México) · Français (Canada) · Deutsch (Schweiz)

A card model of a region from above: one distribution center joined by red threads to many small stores, and a second center with its own.
AI で生成した画像

モジュール2/6:Data Architectコース第2章「意味のあるデータモデリング」。各モジュールは単独でも読めます。 前へ:名詞に耳を傾ける · 次へ:論理モデルを作る

このモジュールが答える問い: 候補エンティティを概念データモデルにするにはどうすればよいか?

ホワイトボードに名詞が並びました。次に知りたいのは箱と箱の間の線です。エンティティを集めただけでは、まだデータモデルとは言えないからです。意味の多くは関係の中にあります。小売パートナーは物流センターを運営している。積荷目録には配送が並ぶ。配送は受取人に届く。クルーがトラックを運転する。どの文もビジネスについて何かを教えてくれ、どの文もまた新しい問いを与えてくれます。

まだSalesforceの話はしたくありません。これを参照関係にすべきか主従関係にすべきかを問うことも、Salesforceの連結オブジェクトを考えることも、親レコードが削除されたら何が起きるかを決めることもしません。ビジネス上の関係を理解しようとしているのです。

**「小売パートナーは物流センターを運営している」**を例にとりましょう。シンプルに聞こえます。でも、小売パートナーの物流センターは1つでしょうか、それとも多数でしょうか? Steve Truckingでは、各小売パートナーが、Steve Truckingがサービスを提供するすべての地域で地域物流センターを運営しています。つまり多数です。1つの物流センターが複数の小売パートナーに属することはあるでしょうか? 物流センターは独自のスタッフや履歴を持つ、それ自体が重要なものなのか、それとも単なる住所なのか? 小売パートナーが去ったら、その物流センターにまだ関心があるでしょうか?

これらはSalesforceの問いではありません。ビジネスの問いであり、その答え次第でモデルはまったく変わり得ます。

さらに深く進む前に、ここから先のすべての図で使う言葉を紹介しておきます。小さな言葉です。2つの箱の間の線は、その2つが関係していることを示し、線の端の記号がいくつかを示します。

まずは記号のない、ただの線から。ホワイトボードで私が始めるのはここです。この2つの名詞が関係していることはわかっているけれど、どう関係しているかはまだ尋ねていない。次に、端に記号が付きます。線を横切る1本の棒は1を意味します。鳥の足のように3本に分かれた端、カラスの足(crow’s foot)は多を意味します。このモジュールの後半では、最初の記号の隣に2つ目の記号、棒か丸が現れます。それは別の問いに答えるものです。ゼロのこともあり得るか?

覚えておくべきルールは一つです。それぞれの記号は、それが接している箱の側で読む。 箱に最も近い記号が最大数、その外側の記号が最小数です。

線を読む このコースの図の言葉の凡例。記号のないただの線は、2つのものが関係しているが、数はまだ決まっていないことを意味します。端の1本の棒は1つ、カラスの足は複数を意味します。任意性を示す2つ目の記号が加わると、2本の棒はちょうど1つ、丸と棒は0または1つ、棒とカラスの足は1つ以上、丸とカラスの足は0以上を意味します。どの記号も、接している箱のところで読みます。 最初:ただの線 ただの線 2つは関係しているが、数はまだ決めていない 次に:1か多か 1つ 1本の棒(十字):接する箱が1つ 複数 カラスの足:接する箱が複数 次に:ゼロはあり得るか? ちょうど1つ 2本の棒:少なくとも1つ、多くても1つ 0または1つ 丸、次に棒:まだ存在しないこともある 1つ以上 棒、次にカラスの足:少なくとも1つ 0以上 丸、次にカラスの足:なくてもよい それぞれの端は接する箱のところで読みます。箱に最も近い記号が最大数、その外側の記号が最小数です。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Steve Truckingの前に、モジュール1の犬に戻りましょう。箱は5つありました。飼い主、ブリーダー、犬、犬種、芸。今度は、その間の線について問います。

1つか多数か? 飼い主は複数の犬を飼えます。アナは2匹飼っています。犬の飼い主は1人です。少なくとも私たちのモデルでは。これが1対多です。飼い主の側に棒、犬の側にカラスの足。ブリーダーも同じ形です。1つのブリーダーが多くの犬を繁殖します。

ゼロはあり得るか? マックスは保護施設から来たので、ブリーダーはまったくいません。ブリーダーの端には丸が付きます。犬のブリーダーはゼロか1つです。一方、どの犬にも飼い主がいるので、そちらの端には2本目の棒が付きます。ちょうど1人です。

多対多か? 1匹の犬は多くの芸を覚えていて、1つの芸、たとえばおすわりは、多くの犬が覚えています。これが多対多で、まさにここで私は隠れた概念を探しに行きます。この犬がこの芸を覚えていることについて、何かあるでしょうか? どれくらい上手にできるか、そしていつ覚えたか。この関係はそれ自体の事実を持っているので、それ自体が一つのものになります。犬の芸(Dog Trick)です。犬の名前が先に来るのは、それを動かしているのが犬だからです。

それぞれの線は何を意味するか? 飼い主は犬を飼う。ブリーダーは犬を繁殖する。犬は芸を覚えている。線に名前を付ければ、誰でもモデルを読み上げて説明し返せます。

今か、時間を通じてか? ベラの今日のおすわりの上手さを気にする人はいるでしょうか、それともそこに至るまでの経緯でしょうか? トレーナーが数か月ごとにベラをチェックするなら、チェックの一つひとつがそれ自体のレコードになります。日付、習熟度、チェックした人を持つ芸の評価(Trick Assessment)で、それが属する犬の芸の下に置かれます。一つのものになった関係でさえ、それ自体の履歴を持てるのです。

犬種は、ひとまずつながないでおきます。モジュール1からの問い、それ自体の箱なのか、犬に書かれた言葉なのか、はまだ残っていて、モジュール4で決着します。

関係を加えた犬のモデル 7つの箱。飼い主は1匹以上の犬を飼い、各犬にはちょうど1人の飼い主がいます。ブリーダーは1匹以上の犬を繁殖し、犬には0または1つのブリーダーがいます。犬は0以上の犬の芸を覚え、芸は0以上の犬の芸で覚えられます。各犬の芸は1匹の犬と1つの芸です。各犬の芸は0以上の芸の評価で評価されます。犬種は単独で、まだつながっていません。 飼う 繁殖する 覚える 覚えられる 評価される 飼い主 ブリーダー 犬 犬種 犬の芸 芸 芸の評価 ちょうど1つ 0または1つ 1つ以上 0以上 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

これらの問いはどれも、本物のビジネスにも同じように使えます。では、Steve Truckingに問いかけてみましょう。

関係について最初に理解したいことの一つがカーディナリティです。データベースの用語ですが、問いはずっとシンプルです。こちらのいくつが、あちらのいくつと関係し得るか? 概念レベルでは、基本的なパターンは3つです。

これはプロセスの中の大切な一歩です。2つの異なる名詞を取り上げ、その関係を理解します。ほとんどの場合、それは1対多か多対1です。1対1に出会うのはまれな状況だけです。

1対多はいたるところにあります。1つの小売パートナーに多数の物流センター。1つの積荷目録に多数の配送。1つのルートに約10か所の停車地。そうした言葉を聞くと、私は線を引き始めます。

そして線に記号が付きます。それぞれの端が、接している箱がいくつかを示します。棒は1、カラスの足は多です。それぞれの箱から読みましょう。1つの小売パートナーには多数の物流センターがあります。

基本のコネクタ、1対多 基本的なカラスの足記法の線で結ばれた2組の箱。1つの小売パートナーが多数の物流センターを運営します。小売パートナー側の端は1本の棒、物流センター側の端はカラスの足です。1つの積荷目録には多数の配送が載り、同じように記されています。それぞれの端には言葉の説明が付いています。 1つの小売パートナー 複数の物流センター 運営する 1つの積荷目録 複数の配送 載せる 小売パートナー 物流センター 積荷目録 配送 1本の棒は1、カラスの足は多。それぞれの端は、接している箱から読みます。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

1対1の関係も存在しますが、まれです。見つけたら、いくつか問いを立てます。これは本当に2つの異なる名詞なのか、それとも同じものなのか? 異なるなら、両者の1対1の関係とは何か? そして、それはずっと1対1なのか、それとも今は1対1なだけなのか? これらはデータモデルを設計するうえでの重要な問いです。クルーとトラックは、ある朝だけを見れば1対1に見えます。2人、1台のトラック、1つのルート。1か月で見ればそうではありません。そしてそこに、このモデルで最も興味深い関係が隠れています。

多対多の関係は特に興味深いものです。ビジネスにもう一つの概念があることを教えてくれることが多いからです。クルーは時間を通じて複数のトラックを運転できるか? はい。トラックは複数のクルーに運転され得るか? その生涯を通じれば、もちろんです。ですからクルーとトラックは多対多の関係にあります。でも、もっと知りたくなります。ビジネスは、あるクルーがあるトラックをいつ使っていたかを気にするでしょうか? どのルートで、どの日に? 誰が割り当てたのか? 関係そのものが私たちの気にする情報を持っているなら、もう一つのビジネス概念を発見したことになります。クルー割り当て(Crew Assignment)です。

これは大切なモデリングの習慣です。最も興味深いものが、最初に聞こえた名詞の一つではないことがあります。それは2つの名詞の間の関係の中に隠れているのです。

ここは、管理者の方々に考え方を変え始めてほしいところの一つです。Salesforceではオブジェクトと項目について話すのに慣れているので、箱が大事な部分で、線はただの配管だと扱いがちです。しかし関係そのものがビジネス上の意味を持ち得ます。

配送とそれに載っている製品を考えてみましょう。1つの配送には複数の製品が載ることがあります。たとえば洗濯機と乾燥機です。1つの製品、同じ冷蔵庫のモデルは、何千もの配送に登場します。ここまでは簡単です。しかし、この配送にその製品がいくつ載っているのか、設置するのか、古いものを引き取るのかを知る必要があるとしたら? もはや配送と製品の関係だけに関心があるのではありません。配送品目(Delivery Item)に関心があり、その概念はそれ自体のエンティティに値します。

Salesforceに慣れている方は、もう「それは連結オブジェクトだ」と考えているかもしれません。間違いではありません。でも、そこから始めたくはないのです。配送品目は、Salesforceの連結オブジェクトである前に、ビジネス概念です。 ビジネスが先、実装は後です。

こうした関係のエンティティについて、最終的にどこで作られるにせよ、私が持っている習慣をいくつか紹介します。

名前を付ける。 ビジネスにすでにそれを指す言葉があるなら、その言葉を使いましょう。なければ、2つの親の名前を組み合わせます。注文と製品を考えてみてください。その間にあるのは注文品目(Order Item)、つまり注文と、注文に載っている品目です。両方の親の子であり、Salesforceでは最終的にSalesforceの連結オブジェクトになるかもしれません。でも、どちらの名前を先にするのでしょう。Item OrderかOrder Itemか? それぞれの親がどんな種類のデータかを見てください。製品は参照データで、注文はトランザクションデータであり、それを動かしているのは注文です。だからOrder Item、あるいはOrder Productです。Salesforceに商談商品(Opportunity Product)があるのと同じです。Steve Truckingでは配送品目(Delivery Item)です。動かしている側の名前が先に来て、目にするどのリストでも、レコードはその持ち主の隣に並びます。

独自のキーを与える。 配送品目は配送と製品の組み合わせで識別される、と言ってそこで止めたくなります。それは複合キーであり、複合キーはずっと扱いにくいものです。そのレコードを指すすべてのシステムが両方の半分を持ち歩かなければなりません。関係のエンティティには独自の識別子を与え、配送と製品の組み合わせは識別子ではなく、一意性についてのルールとしておきましょう。

2つの親と1つの子:子に独自のキーを 2つの親と1つの子。配送(レコードIDは配送ID、配送日、ステータス)は多数の配送品目を含みます。製品(レコードIDは製品ID、名前、型番)は多数の配送品目に載ります。配送品目はその間にあり、独自のレコードIDである配送品目IDを持ち、2つの親の配送IDと製品ID、そして数量を持ちます。下の注記:配送ID+製品IDは一意性のルールであって、レコードIDではありません。 トランザクションデータ 参照データ 含む 載る 配送 配送ID レコードID 配送日 ステータス 配送品目 配送品目ID レコードID 配送ID 製品ID 数量 製品 製品ID レコードID 名前 型番 配送ID+製品ID:一意性のルールであって、レコードIDではありません。 1つ 複数 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

そこにないものに注目してください。シリアル番号です。数量とシリアル番号は同じレコードに属しません。数量はあるものが何個あるかを数え、シリアル番号は特定の1個を識別します。ビジネスがシリアル番号を必要とするなら、1台ずつがそれぞれのレコードになり、冷蔵庫5台は5レコードになります。配送品目の下に配送品目明細を置くケースは考えられません。どちらか一方です。数量を持つ集計か、1台につき1レコードか。ここでは数量です。

履歴を必要とする属性に注意する。 関係のエンティティには、作成された時点で落ち着くものもあります。この配送の洗濯機は、ずっとこの配送の洗濯機です。変わり続けるものもあります。あるクルーが今週はトラック117を使い、来週そのトラックは別のクルーに移ります。関係が変わり、以前どうだったかをビジネスが気にするなら、関係のエンティティには日付が必要です。注意すべきなのはクルー割り当てです。ビジネスが気にしているのは今なのか時間を通じてなのかを早めに尋ねましょう。すぐ後で改めて取り上げます。

関係にはカーディナリティ以上の意味がある

Section titled “関係にはカーディナリティ以上の意味がある ”

「1対多」だけでは、関係を理解するのに足りません。その関係が何を意味するのかも知りたいのです。

配送には場所があります。どの場所でしょう? 出発する物流センター? 届け先の受取人の家? この二つは入れ替えられません。まったく同じ箱と同じカーディナリティを持つ2つのモデルでも、線がまったく違うことを意味している場合があります。だから、よいモデルはただ箱を線でつないだものではないのです。線には名前が必要です。 私の図を別のアーキテクトに渡したとき、関係が何を意味するのかを推測させてはいけませんし、ビジネスに見せるなら、彼らにわかる言葉を使うべきです。

線には名前が必要 2つのパネル。どちらも場所の箱の下に配送の箱があり、2本の線で結ばれています。どの線も、1つの場所に多数の配送と記されています。左のパネル「線に名前なし」では、2本の線に名前がなく、見分けがつきません。右のパネル「名前付きの線」では、一方の線に「出発地」、もう一方に「配送先」という名前が付いています。同じ箱、同じカーディナリティ。どの線がどれかを教えてくれるのは名前だけです。 線に名前なし 名前付きの線 出発地 配送先 場所 配送 場所 配送 同じ箱、同じカーディナリティ。どの線がどれかを教えてくれるのは名前だけです。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

「いくつか?」の中には、もう一つの問いが隠れています。その関係は必須か? 配送は、ルートに載る前から存在できるでしょうか? 存在しなければなりません。積荷目録は配送の1、2日前に届き、ルートは前日の夕方に確定するからです。配送は小売パートナーなしで存在できるでしょうか? できません。すべての配送はパートナーの積荷目録から来ます。これが任意性です。

ここでもやはり、すぐにSalesforceの必須チェックボックスに飛びつかないでください。「すべての配送には小売パートナーがなければならない」と言うことと、「レコード作成時にSalesforceが小売パートナー項目を必須にすべきだ」と言うことは違います。最終的には同じ実装になるかもしれませんが、同じ主張ではありません。前者はビジネスルールで、後者はそれを強制する方法の一つです。アーキテクトとして、後者を決める前に前者を理解したいのです。

図では、任意性はそれぞれの端の2つ目の記号です。箱に最も近い記号が最大数で、棒なら1、カラスの足なら多です。その外側の記号が最小数で、もう1本の棒なら少なくとも1、丸ならゼロもあり得ます。ですから、すべての配送はちょうど1つの積荷目録に載り、積荷目録には1つ以上の配送が並びます。配送は0か1つの停車地にあり(ルートが組まれるまではなし)、停車地では0個以上の配送が降ろされます。

それぞれの端の2つの記号を読む 一列に並んだ3つの箱:積荷目録、配送、停車地。積荷目録には1つ以上の配送が載り、各配送はちょうど1つの積荷目録に載ります。積荷目録側の端には2本の棒、配送側の端にはカラスの足と棒があります。停車地では0以上の配送が降ろされ、各配送は0または1つの停車地にあります。配送側の端には丸とカラスの足、停車地側の端には丸と棒があります。箱に最も近い記号が最大数で、その外側の記号が最小数です。 ちょうど1つの積荷目録 1つ以上の配送 載せる 0または1つの停車地 0以上の配送 降ろす 積荷目録 配送 停車地 箱に最も近い記号は最大数(1か多)。その外側の記号は最小数(棒は少なくとも1、丸はゼロ)。 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

私がよく尋ねる問いがあります。今のことですか、それとも時間を通じてのことですか?

クルーがトラックを運転する。今? 今日のルートで? その2人が一緒に働く間ずっと? それぞれ違うモデルになります。ビジネスが、今日クルーがどのトラックを使っているかだけを気にするなら、モデルはシンプルなままでかまいません。クルーが運転したすべてのトラックを、いつ、どのルートでかまで必要とするなら、履歴が必要になり、先ほど発見したクルー割り当てが突然とても重要になります。

クルー割り当て:どのクルーがどのトラックを持つか 2つの親と1つの子。クルー(レコードIDはクルーID、名前、ステータス)は多数のクルー割り当てに従事します。トラック(レコードIDはトラックID、車両番号でも知られる。メーカー、モデル、ステータス)は多数のクルー割り当てに使われます。各クルー割り当ては独自のレコードIDを持ち、クルーIDとトラックIDを持ちますが、日付はありません。下の注記:どのクルーがどのトラックを持つかはわかるが、いつからかはわからない。 従事する 使われる クルー クルーID レコードID 名前 ステータス クルー割り当て クルー割り当てID レコードID クルーID トラックID トラック トラックID レコードID 車両番号 別名 メーカー モデル ステータス どのクルーがどのトラックを持つかはわかるが、いつからかはわからない。 1つ 複数 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

これはモデリングの誤りのよくある原因です。画面で見えるのは現在の状態なので、現在の状態をモデリングします。そして数週間後、小売パートナーが損傷のクレームを申し立て、誰かが「3月17日にトラック117を使っていたのはどのクルーか?」と尋ねます。そこで、割り当てが変わるたびにその答えを上書きしていたことに気づくのです。

その履歴を残す方法の一つが、割り当てをそれ自体のレコードにすることです。クルーが割り当てられたら、開始日付きのクルー割り当てを作成します。割り当てが変わったら、古いレコードに終了日を入れ、独自の開始日を持つ新しいレコードを作ります。これで「半年前にその割り当てを持っていたのは誰か?」は、項目履歴やデータ変更ログを掘り返すことなく、簡単に答えられる問いになります。そして、クルーに多くの割り当てがたまれば、どれが現在の割り当てかを尋ねる人が出てくるので、私なら有効(Active)フラグも追加します。

時間を通じたクルー割り当て:日付と有効フラグ 日付の付いた2つの親と1つの子。クルー(レコードIDはクルーID、名前、ステータス)は多数のクルー割り当てに従事します。トラック(レコードIDはトラックID、車両番号でも知られる。メーカー、モデル、ステータス)は多数のクルー割り当てに使われます。各クルー割り当ては独自のレコードIDを持ち、クルーIDとトラックID、開始日、終了日、有効フラグを持ちます。下の注記:変更のたびに一つの割り当てが終わって次が始まり、有効フラグが現在のものを示します。 従事する 使われる クルー クルーID レコードID 名前 ステータス クルー割り当て クルー割り当てID レコードID クルーID トラックID 開始日 終了日 有効 トラック トラックID レコードID 車両番号 別名 メーカー モデル ステータス 変更のたびに一つの割り当てが終わり、次が始まります。有効フラグが現在のものを示します。 1つ 複数 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

ですから、誰かが関係について話してくれたとき、私はものごとがどう関係しているかだけを尋ねるのではありません。**その関係は変わるのか、そしてその履歴を気にするのか?**と尋ねます。

Steve Truckingのモデルは役に立つものになりつつあります。どの関係が1対多か、どこで多対多が別の概念を隠しているか、どの関係が任意か、どの関係が時間とともに変わるかがわかっています。そして、まだSalesforceのオブジェクトを一つも作っていません。それは意図的です。

モジュール1と2を終えた時点の概念モデル Steve Truckingの概念モデル。顧客データ、トランザクションデータ、参照データに分けられています。小売パートナーは積荷目録を送り、積荷目録には配送が載ります。また小売パートナーは物流センターを運営します。各配送は物流センターから出発し、受取人に届けられ、配送品目を含みます。ルートには停車地があり、停車地で配送が降ろされます。クルー割り当てがクルーとトラックをルートに結びつけるので、誰がいつどのトラックを運転したかがモデルに残ります。 顧客データ トランザクションデータ 参照データ 運営する 送る 載せる 含む 出発地 配送先 持つ 降ろす 担当する 従事する 使われる 小売パートナー 配送を請け負う小売業者 受取人 受け取る人 積荷目録 パートナーの配送リスト 配送 1件の注文を1人の受取人へ 配送品目 トラックに積むもの ルート 1日分の停車地の巡回 停車地 ルート上の1つの住所 クルー割り当て 誰がいつどのトラックを運転したか 物流センター 配送の出発地 クルー 2人1組 トラック 車両 ちょうど1つ 0または1つ 1つ以上 0以上 © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

この図は、ビジネスの前に出せるものであるべきです。それが正しいかどうかを私に教えるのに、Salesforceを知っている必要があってはいけません。Salesforceの用語だらけでビジネスが検証できないなら、私は物理設計に進むのが早すぎたのです。

ここでアーキテクトが決めること

Section titled “ここでアーキテクトが決めること ”

概念モデルの関係を検討するとき、私が決めているのは次のことです。

  • 主要なビジネスエンティティが互いにどう関係しているか。
  • それぞれの関係が、今そして時間を通じて、1対1、1対多、多対多のどれか。
  • それぞれの関係が必須か任意か。
  • 多対多の関係が、意味のあるビジネス概念を隠していないか。
  • その関係が時間とともに変わるか、そしてその履歴が必要か。

参照関係か主従関係か、連結オブジェクトの構成、連鎖削除の振る舞い、共有は物理的な判断です。いずれそこにたどり着きます。今はまだ、もっと重要な問いに答えているところです。このビジネスは実際にどう動いているのか? エンティティとその間の関係を理解できたら、それらを記述する詳細を加え始められます。そのとき、概念モデルは論理データモデルになり始めるのです。