はじめに
hkob の雑記録の第209回目は、Concerts と ConcertHalls を繋ぐ Performances を追加します。
ER図
Performances は Concerts, ConcertHalls に接続します。今のデータベースでは繋がっていませんが、Date property があるので、Year にも接続したいですね。これも追加しておきます。ただ、Year も Date が存在するところに全部繋がるので、図的にはグチャグチャしてきます。こちらもリレーションの接続線だけは省略していいかもしれません。

Performances のエクスポート
Performances は以下のプロパティをエクスポートすることにします。

作成した CSV ビューはこんな感じです。今回、修正したいのは Name が 01, 02 のように無機質なタイトルになっていることです。このことを踏まえてデータベースの移行を進めていきます。

前回と同様に CSV に書き出し後、リレーションの URL 削除をしてしまいます。
sed 's/ (https:\/\/www.notion.so[^)]*)//g' Performances\ e8108114ce7b42d6bc146b7247e22fdb.csv | sed 's/\([0-9][0-9]*\)\/\([0-9][0-9]*\)\/\([0-9][0-9]*\)/\1-\2-\3/g' | sed 's/ → /\//g' > Performances.csv
変換結果は以下のようになります。タイトルの部分にコンサート内の通番をタイトル (Name) としていましたが、この部分は Order という数値プロパティにしたいです。このため、Name → Order に変更します。プロパティの名前を変更するのが面倒なので、先に ConcertHall → ConcertHallStr に変更しておきます。また、Title だった Name 属性がなくなってしまったので、これまでの Concert を Name に変更しておきます。Name の部分は後でオートメーションで上書きされてしまうので、プロパティを消す手間も省けます。
Order,Date,Name,ConcertHallStr,Hall info,Product,Live reports,Comments 01,1987-09-07,渋谷ライブイン ファーストライブ,渋谷ライブイン,,,, 01,1987-12-11,"「OVERHEAT. NIGHT」, 「GET SMILE」",大阪厚生年金会館,[中ホール],,,「OVERHEAT. NIGHT」 02,1987-12-17,"「OVERHEAT. NIGHT」, 「GET SMILE」",日本青年館,,,,「GET SMILE」<ビデオ収録> 03,1988-03-11,"「OVERHEAT. NIGHT」, 「GET SMILE」",徳島ベガホール,,,,「GET SMILE」
Performances の作成 & インポート
森高千里DBの下に作成したいので、また Cmd-Opt-9 で新規ページを作成します。この新規ページを開き、インポートを実施しました。

インポートを実行しました。

リレーションの作成
Concert と ConcertHall リレーションを追加します。どちらも1対多の関係となります。このため、1ページ制限を付加しています。また双方向リレーションも追加します。


Year, Map リレーション追加と Year 自動設定の追加
いつものように Year, Map リレーションを追加し、Map 自動追加、Year 自動追加のオートメーションを設定します。同じことの繰り返しになるので、ここは説明を省略します。

Notion API で Concert, ConcertHall データを準備
これまでと同様に Name から Concert, ConcertHallStr から ConcertHall を設定してみます。concert_id_hash, concert_hall_id_hash まではこれまでと同様です。
concerts_db = Database.find "https://www.notion.so/hkob/239d8e4e98ab806186e0e6e9a36b14ff?v=231d8e4e98ab80d99376000c19fe73ed&source=copy_link" => NotionRubyMapping::Database-239d8e4e98ab806186e0e6e9a36b14ff concerts = concerts_db.query_database => NotionRubyMapping::List- concerts_id_hash = concerts.each_with_object({}) { |c, h| h[c.properties["Name"].full_text] = c.id } => {"森高千里 Autumn Tour 2014 ~LOVE~"=>"239d8e4e98ab81099f72de9154e3331e", ...
concert_halls_db = Database.find "https://www.notion.so/hkob/23ad8e4e98ab800685edf986f1cb15c2?v=231d8e4e98ab80d99376000c19fe73ed&source=copy_link" => NotionRubyMapping::Database-23ad8e4e98ab800685edf986f1cb15c2 concert_halls = concert_halls_db.query_database => NotionRubyMapping::List- concert_halls_id_hash = concert_halls.each_with_object({}) { |ch, h| h[ch.properties["Name"].full_text] = ch.id } => {"大阪 IMP ホール"=>"23ad8e4e98ab81789cd9d725278f8c3e", ...
次に、Performances データベースを読み込み、それぞれのプロパティを取得します。
performances_db = Database.find "https://www.notion.so/hkob/23cd8e4e98ab8049a856c05ad8eac93a?v=231d8e4e98ab80d99376000c19fe73ed&source=copy_link" => NotionRubyMapping::Database-23cd8e4e98ab8049a856c05ad8eac93a pc = performances_db.properties["Concert"] => #<NotionRubyMapping::RelationProperty:0x0000000123abf148 ... pch = performances_db.properties["ConcertHall"] => #<NotionRubyMapping::RelationProperty:0x00000001238999e0 ...
さらに Prefecture が空のコンサートホール一覧を取得します。途中でエラーが出た時に続きから実行できるようにするためです。
performances = performances_db.query_database(pc.filter_is_empty) => NotionRubyMapping::List-
あとは先ほど作成した hash を使って設定しまくるだけです。
performances.each do |performance| pp = performance.properties concert_str = pp["Name"].full_text pp["Concert"].relation = [concerts_id_hash[concert_str]] concert_hall_str = pp["ConcertHallStr"].full_text pp["ConcertHall"].relation = [concert_halls_id_hash[concert_hall_str]] p [concert_str, concert_hall_str] performance.save end ["ハタチのシャ乱Qみんなでお祝いだ!日本武道館フェスィバル~長いよ~", "日本武道館"] ["さい帯血バンク支援コンサートPacific Heaven", "横浜アリーナ"] ["さい帯血バンク支援コンサートPacific Heaven", "名古屋レインボーホール"] ["「サバサバ」ツアー", "東京国際フォーラム"] ["「サバサバ」ツアー", "東京国際フォーラム"] ["「サバサバ」ツアー", "名古屋センチュリーホール"] ["「サバサバ」ツアー", "名古屋センチュリーホール"] ["「サバサバ」ツアー", "神戸国際会館ハーバーランドプラザ"] (後略)
これで無事に Concert, concertHall, Year リレーションが設定されました。

Notion API の設定後にオートメーションが追っかけて変更されるのが面白かったので、動画を撮って X にポストしてみました。
CSV インポートでリレーションが設定できなくなったので、Notion API でテキストから設定しています。Year の方はプロパティ編集時のデータベースオートメーションで後から追っかけて設定されています。#Notion #NotionAPI pic.twitter.com/QSqippjWBk
— hkob|Notion Ambassador (@hkob) 2025年7月26日
現在存在する全てのページの Year が設定できたので、オートメーションのトリガを Date が設定された時に変更しました。

タイトルの自動設定
これまでタイトルは 01, 02 のような数値だけになつていました。今回、この情報は Order という数値プロパティに移動しました。そこで、この Order, Concert および ConcertHall から Name を自動設定するデータベースオートメーションを作成します。

ここで設定した値は以下のように設定しました。

オートメーションは以下のように3つ設定されました。

オートメーションの確認
試しに最初の一つだけタイトルの文字列を消してみたところ、想定通りのタイトルが設定されました。

あとは全てのタイトルを削除したところ、一気にタイトルが自動設定されました。

おわりに
今回、私が一番やりたかったタイトルの自動設定がかなりいい感じで動作しました。番号と会場を選択するだけで、タイトルが綺麗に整形されるので非常にみやすくなりました。