
目次
Notionのデータを取り出して、AIに渡す。そのとき、1つの列だけが意味を失います。
取引先の欄に、会社名ではなく意味のない文字の羅列が入っている。そういう状態で渡していることがあります。
16種類の列を持つデータベースを作って、型ごとに確かめました。
16種類の列のうち、1つだけ意味が消えます
結論から書きます。
リレーションだけが、名前を返しません
ほかのデータベースとつなぐ列。これを取り出すと、つないだ相手のIDだけが返ってきます。
返ってくるのは、こういう形です。
取引先: 3e836319-0548-81b3-a465-f6a6060389ef
会社名はどこにもありません。これをそのままAIに渡しても、何も伝わりません。
気づきにくい形で壊れます
ここが厄介です。データとしては、ちゃんと値が入っています。空欄でもエラーでもありません。
取り出した側から見ると、取引先の欄に何かが入っている。形式としては正常です。
ところが、その中身に意味がない。渡した先で「取引先が分かりません」とは返ってきません。あるものとして扱われます。
どういう答えが返るか
取引先が分からないまま答えると、どうなるか。
| 聞いたこと | 起きること |
|---|---|
| 取引先ごとに集計してほしい | IDごとに集計される |
| 甲社の案件を教えてほしい | 甲社という文字がないので見つからない |
| 取引先の傾向を分析してほしい | 分析はされるが、どこの話か分からない |
いちばん困るのが3つ目です。それらしい答えは返ってきます。ただ、その中の会社名がIDのままなので、読んでも判断に使えません。
集計そのものは正しいかもしれません。正しいのに使えない、という形の失敗になります。
ほかの列は、ちゃんと名前が入っています
比べてみると、リレーションだけが例外だと分かります。
15種類は、そのまま読めました
| 列の型 | 返ってくるもの |
|---|---|
| タイトル | 文字がそのまま |
| 数値 | 数がそのまま |
| セレクト | 選んだ名前が入っている |
| ステータス | 選んだ名前が入っている |
| マルチセレクト | 選んだ名前が全部入っている |
| 日付 | 日付がそのまま |
| チェックボックス | はい・いいえ |
| URL | そのまま |
| メール | そのまま |
| 電話番号 | そのまま |
| 担当者 | 人の名前が入っている |
| 作成者 | 人の名前が入っている |
| 作成日時 | 日時がそのまま |
| 数式 | 計算した結果が入っている |
| ロールアップ | 集計した結果が入っている |
| リレーション | IDだけ |
上の15種類は、そのまま読めます。読めないのは、いちばん下のリレーションだけです。16種類のうち1つ、ということになります。
「名前を持っているか」で分かれます
セレクトもステータスも、選択肢の名前を持っています。担当者も、人の名前を持っています。
リレーションだけが、名前を持っていません。
これは仕組みとして自然でもあります。つないだ相手は別のページなので、名前はそちらにあります。ただ、渡す側からすると「1つだけ違う」という事実が重要です。
つまり、気にするのは1列だけです
逆に言えば、ほかの列は何も考えずに渡せます。名前を引きに行く処理が要るのは、リレーションだけです。
データベースにリレーションが無いなら、この記事の話は関係ありません。そのまま渡して大丈夫です。
自分のデータベースで、すぐ確かめられます
渡しているデータを一度そのまま眺めてみてください。36文字くらいの、英数字とハイフンが混ざった文字列を探します。
それが見つかったら、そこがリレーションです。その列の中身は、渡した先には伝わっていません。
| 見つかったもの | 意味 |
|---|---|
| 会社名、担当者名、状態の名前 | そのまま伝わっている |
| 英数字とハイフンの長い文字列 | 伝わっていない |
数えるより、目で見たほうが早いです。
しかも、25件で黙って切れます
もう1つ、リレーション特有の問題がありました。
30件つないで、25件しか返りません
1つの行に30社をつないで、取り出してみました。
| 取り出し方 | 返った件数 |
|---|---|
| データベースの中身を取り出す | 25件 |
| その列だけを名指しで取り出す | 30件(全部) |
ふつうの取り出し方では、26件目から先が落ちます。
「まだある」は付きます
救いは、「まだある」という印が付いてくることです。これを見ていれば、切れたことは分かります。
ただ、1回に100件までしか返らない話と同じで、印を見ていなければ気づけません。
行の件数のほうは100件で切れますが、リレーションはもっと手前の25件で切れます。桁が違うので、先に当たるのはこちらです。
その列だけを取り出す方法があります
全部欲しいときは、その列だけを名指しで取り出す方法があります。今回は1回で30件すべて返りました。
ただし、行ごと、列ごとに呼ぶことになります。100行あれば100回です。次の話につながります。
1件ずつ引くと、25回かかります
では、IDから名前を引けばいいのではないか。そう考えます。
実際にやると、こうなりました
25件のリレーションについて、IDからページを1つずつ引いて名前を取り出しました。
| 結果 | |
|---|---|
| 呼んだ回数 | 25回 |
| かかった時間 | 9.3秒 |
1行ぶんで、これです。
読むのは速いはずなのに、なぜ時間がかかるのか。1回の呼び出しで1件しか取れないからです。まとめて取る方法がありません。
データベースの中身なら、1回で100件まとめて取れます。ところがページを名指しで取るときは、1回に1件です。
行が増えると、掛け算になります
| 行数 | 1行に5件つないでいると |
|---|---|
| 10行 | 50回 |
| 100行 | 500回 |
| 1,000行 | 5,000回 |
本体を読むのは数回で済むのに、名前を引くために数百回。ここで時間のほとんどを使うことになります。
時間で見ると、こうなります。1件あたり0.37秒として計算した目安です。
| 行数 | 名前を引く時間の目安 |
|---|---|
| 10行 | 約20秒 |
| 100行 | 約3分 |
| 1,000行 | 約30分 |
毎日動かす処理なら、この時間が毎日かかります。本体の取得は数秒で終わっているのに、です。
同じ相手を何度も引きます
さらに無駄があります。取引先は、複数の案件から同じ会社がつながっているはずです。
行ごとに素直に引くと、同じ会社を何度も引きます。一度引いた分を覚えておけば減らせますが、そこまで作り込むことになります。
| やり方 | 100行・取引先50社の場合 |
|---|---|
| 素直に1件ずつ引く | 500回(同じ会社を何度も) |
| 一度引いた分を覚えておく | 50回 |
| 次に出てくる方法 | 0回 |
真ん中でも十分に速くなります。ただ、覚えておく仕組みを自分で作ることになります。次に書く方法なら、それも要りません。
列を1つ足すだけで解決します
もっと簡単な方法がありました。
ロールアップで、相手の名前を持ってこられます
ロールアップは、つないだ相手の列を集計する仕組みです。件数を数えたり、合計を出したりするものだと思われがちです。
ところが、集計せずに中身をそのまま持ってくる指定がありました。
取引先のリレーションに対して、相手の「会社名」をそのまま持ってくる列を1つ足します。すると、取り出したときに会社名が入って返ってきます。
追加の呼び出しが、0回になります
| 方法 | 追加の呼び出し | 取れる件数 |
|---|---|---|
| IDから1件ずつ引く | 25回・9.3秒 | 25件 |
| ロールアップを1列足す | 0回 | 30件すべて |
呼び出しが要らないうえに、25件の制限も受けませんでした。30件つないだものが、30件とも返っています。
ロールアップの指定は24種類ありました
ついでに、ロールアップで何ができるのかも数えました。24種類です。
ほとんどが数を数えるもの、合計や平均を出すもの、最も早い日付を出すものです。中身をそのまま持ってくるのは2種類だけでした。
ひとつは全部そのまま。もうひとつは重複を省いたものです。今回使うのは前者になります。
| できること | 種類の数 |
|---|---|
| 数を数える(件数、空欄の数、割合など) | 10種類ほど |
| 計算する(合計、平均、最大、最小など) | 6種類ほど |
| 日付を扱う(最も早い、最も遅い、期間) | 3種類 |
| チェックの数を数える | 4種類 |
| 中身をそのまま持ってくる | 2種類 |
ほとんどが集計用です。中身を運ぶ用途は、あまり知られていない使い方だと思います。
ちなみに、この一覧は存在しない指定をわざと送ると全部返ってきます。自分の環境で何ができるかを調べるときに使えます。
図にすると、こういう違いです
ただし、絞るまでがセットです
いいことばかりではありません。
そのままだと、6倍に膨らみます
同じ30件について、文字数を数えました。
| 中身 | 文字数 |
|---|---|
| IDだけ(元の状態) | 1,266 |
| ロールアップで取ったもの | 7,749 |
| 名前だけに絞ったもの | 236 |
意味は通るようになりましたが、文字数は6倍になりました。
理由は、装飾の情報です
ロールアップで持ってくるのは、相手の列の中身そのものです。文字の列なので、太字かどうかといった装飾の情報が一緒に付いてきます。
会社名が30件なら、その装飾の情報も30件分です。
名前だけ拾えば、元より小さくなります
ここから名前だけを拾い直すと、236文字になりました。IDだけだったときの1,266文字より小さいです。
IDは1つ36文字あります。会社名は数文字です。意味が通るようになって、しかも小さくなりました。
手順にすると、3つです
| 順番 | やること |
|---|---|
| 1 | リレーションのある列に、相手の名前を持ってくるロールアップを足す |
| 2 | いつもどおり取り出す(追加の呼び出しは無し) |
| 3 | 名前だけを拾い直してから渡す |
1は画面からでもできます。一度足せば、あとはずっと使えます。
新しく仕組みを作る必要はありません。データベース側を1回直すだけです。取り出す処理は、そのままで構いません。
すでに動いている処理がある場合も、列を足すだけなら壊れません。返ってくる項目が1つ増えるだけです。
渡す前と、渡したあとで比べてください
やったあとに確かめるのも簡単です。
| 確かめること | 見方 |
|---|---|
| IDが残っていないか | 長い英数字の文字列を探す |
| 件数が合っているか | 画面で見える数と比べる |
| 文字数が減っているか | 渡す前に数えておく |
2つ目は、25件を超えている行で確かめてください。少ない行だけ見ていると、切れていることに気づけません。
よくある質問(FAQ)
リレーションのIDから、名前を引く以外に方法はありませんか。
ロールアップを1列足すのがいちばん簡単でした。追加の呼び出しが要らず、25件の制限も受けません。画面から1回足すだけです。
25件を超えるかどうかは、どう判断しますか。
取り出したときに「まだある」という印が付きます。それを見てください。ロールアップを足しておけば、そもそも切れませんでした。
ロールアップを足すと、画面の見た目が変わりませんか。
列が1つ増えます。画面で見せたくない場合は、ビューで隠せます。外から取り出すときには、隠していても入ってきました。
双方向につないでいる場合はどうなりますか。
どちらの側から見てもIDだけが返ります。名前が欲しい側にロールアップを足してください。
名前だけに絞るのは、どうやりますか。
取り出したデータから、名前にあたる部分だけを拾い直します。難しい処理ではありません。今回は7,749文字が236文字になりました。
リレーションの相手が消されていたら、どうなりますか。
そこは確かめていません。運用でページを消すことがあるなら、消したあとに一度取り出して確かめてから本番に入れてください。
ロールアップを1列足してください
リレーションはIDしか返さず、25件で切れます。相手の名前を持ってくるロールアップを1列足せば、追加の呼び出しなしで全件そろいます。あとは名前だけに絞ってから渡してください。