1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

運用中のヘッドレス CMS のフィールドを触るのは、正直怖い作業です。
フィールドの削除はデータベースの列削除に直結するので、操作ひとつでコンテンツデータが消える 可能性があります。

先日、まさに運用中の Directus でフィールドの整理(不要な項目の非表示化・命名の見直し・不要フィールドの削除)を行い、データを一切壊さずに完了 できたので、そのとき守った手順を紹介します。
同じようにヘッドレス CMS の運用で「触るのが怖い」と感じている方の糧にしていただけたら幸いです。

本記事は 2026 年 6 月時点の Directus で確認した内容です。スキーマ操作の挙動はバージョンによって変わる可能性があるので、必ずご自身の環境でも確認してください。

Directus のフィールド操作は「DB スキーマ操作」である

Directus は、データベースのテーブル・列をそのまま管理画面に映し出す思想の ヘッドレス CMS です。
つまり、管理画面でのフィールド操作は データベースのスキーマ操作に直結 します。

管理画面での操作 データベースで起きること 可逆性
フィールドを隠す(hidden / conditions) 何も起きない(表示の設定だけ) ✅ いつでも戻せる
フィールドを追加する 列が追加される ✅ ほぼ安全
フィールド名(キー)を変えたい 列の作り直しに相当 ⚠️ 危険
フィールドを削除する 列ごとデータが消える ❌ 不可逆

ポイントは、操作によって 可逆性がまったく違う ことです。
この表を意識して、「可逆的な操作から始めて、不可逆な操作は確認が取れてから」という順番で作業します。

今回題材にしたい状況

私が関わっているプロジェクトでは、1 つの記事コレクションをテンプレート(記事の種類)によってフィールドを出し分けて運用しています。

その中で、3 つの整理が必要になりました。

  1. あるテンプレートに 不要なフィールドが表示されている
  2. あるフィールドの名前が 用途に対して狭すぎる(特定用途専用のような名前だが、汎用的に使いたい)
  3. その結果、使われなくなるフィールドが出る

雑にやるなら「フィールドを消して、リネームして、終わり」です。
ですが運用中の CMS でそれをやると、入稿済みのコンテンツデータが巻き添えで消える リスクがあります。

そこで、データに触れない操作から順番に 進めることにしました。

この記事で伝えたいこと

運用中の CMS でフィールドを整理するときの原則は、これに尽きます。

可逆的な操作から始めて、不可逆な操作は「使われていない」ことを確認できてから。

具体的には、次の 3 ステップで進めます。

  1. まず「隠す」(データ無傷・いつでも戻せる)
  2. リネームせず「新フィールドを併存」させる(古いデータを残したまま移行)
  3. 削除は「利用箇所ゼロ」を確認してから(不可逆な操作は最後)

手順① 削除ではなく、まず「隠す」

「このテンプレートではこのフィールドは不要」というとき、最初に検討すべきは削除ではなく 非表示 です。

Directus には conditions(条件付き表示)という機能があり、他のフィールドの値に応じて hidden / readonly / required を切り替え られます。

{
  "name": "非表示",
  "rule": {
    "template": { "_eq": "sample" }
  },
  "hidden": true
}

これは 表示レイヤーだけの変更 で、データベースには一切触れません。
「間違って隠しすぎた」となっても、設定を戻せば元通りです。

conditions を組み合わせるとき1 つの condition の rule 内に条件を複数書くと ANDcondition 自体を分けて追加すると OR 的 に効きます。
「テンプレート A でも B でも隠したい」ときに rule へ条件を足すと AND になってどちらにも効かなくなるので、condition を分けましょう。

「不要に見えるフィールド」が本当に不要かは、この時点では確定していません。
隠した状態でしばらく運用して、誰も困らないことを確かめる ことが、削除の前の安全確認を兼ねます。

手順② リネームせず、新フィールドを「併存」させる

次に、フィールド名の見直しです。

注意したいのは、Directus では フィールドのキー(DB の列名に対応する識別子)を後から変更できない ことです。
表示名(ラベル)は安全に変えられますが、キーを変えたければ実質「作り直し」になります。

ここで「古いフィールドを消して、新しい名前で作り直す」と一気にやると、古いフィールドに入っていたデータが消えます

そこで取ったのは 併存 です。

1. 汎用的な名前で新フィールドを作成(列の追加 = 安全な操作)
2. 管理画面上は同じフィールドグループに配置(編集者からは自然に見える)
3. 古いフィールドはそのまま残す(データも残る)

この時点で、新旧のフィールドが両方存在する状態になりますが、データは何も失われていません
古いフィールドの削除は、次の手順③で「消してよい」と確認できてからです。

手順③ 削除は「利用箇所ゼロ」を確認してから

最後に、不要になったフィールドの削除です。ここだけが 不可逆な操作 なので、いちばん慎重にやります。

ヘッドレス CMS のフィールドが「使われているか」は、CMS 側だけ見ていても分かりません
利用者はフロントエンドのコードだからです。削除の前に、コードベースを検索します。

# フィールド名(キー)でフロントエンドのコードを検索
grep -r "old_field_name" ./src

確認する観点は次のとおりです。

  • フロントエンドのコードでフィールド名を参照している箇所はないか
  • API レスポンスの型定義(zod スキーマや TypeScript 型)に含まれていないか
  • 入稿済みデータでそのフィールドに値が入っているレコードはないか

今回は検索の結果、コード側での利用がゼロであることを確認できたので、ここで初めて削除を実行しました。
「たぶん使ってない」ではなく「検索して利用ゼロを確認した」 という状態を作ってから消すのが肝心です。

コードを検索しても、外部連携(他システムが API 経由でそのフィールドを読んでいる等)までは分かりません
外部にデータを提供している CMS の場合は、利用先のチームへの確認も削除前のチェックリストに入れてください。

まとめ

操作の可逆性と実行順序

今回の作業を「可逆性」の観点で並べ直すと、こうなります。

順序 操作 データへの影響 可逆性
1 conditions で隠す なし(表示のみ) ✅ いつでも戻せる
2 新フィールドを追加して併存 列の追加のみ ✅ ほぼ安全
3 利用箇所を検索して確認 なし(読むだけ) ✅ 安全
4 古いフィールドを削除 列ごと消える ❌ 不可逆

不可逆な操作(削除)が 一番最後の 1 回だけ になっているのがポイントです。
途中のどの段階で「やっぱりやめた」となっても、データは無傷のまま引き返せます。

これはフィールド整理に限らず、運用中のシステムに変更を加えるときの一般的な原則 だと思っています。
「destructive な操作を後ろに寄せて、その前に可逆的な確認ステップを積む」— データベースのマイグレーションでも、ファイル操作でも、同じ考え方が通用します。

本記事の要点は下記のとおりです。

  • Directus のフィールド操作は DB スキーマ操作に直結 する。削除 = 列ごとデータ消失(不可逆)
  • 不要なフィールドは、まず conditions で隠す(データ無傷・可逆)
  • フィールドキーはリネームできないので、新フィールドを併存 させて移行する(古いデータは残る)
  • 削除は コードの利用箇所を検索して「ゼロ」を確認 できてから。外部連携があるなら利用先にも確認
  • 原則は「可逆的な操作から始めて、不可逆な操作は最後に 1 回だけ

運用中の CMS を触る怖さは、手順の設計でほとんど消せます。
「消す前に隠す、作り直す前に併存させる」ぜひフィールド整理の参考にしてみてください!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?