diff --git a/db/click_house/migrate/main/20250220182253_create_namespace_traversal_paths.rb b/db/click_house/migrate/main/20250220182253_create_namespace_traversal_paths.rb
new file mode 100644
index 0000000000000000000000000000000000000000..54d73ce0ea452f0f07c6ecb248a908716b7a3757
--- /dev/null
+++ b/db/click_house/migrate/main/20250220182253_create_namespace_traversal_paths.rb
@@ -0,0 +1,23 @@
+# frozen_string_literal: true
+
+class CreateNamespaceTraversalPaths < ClickHouse::Migration
+  def up
+    execute <<-SQL
+      CREATE TABLE namespace_traversal_paths (
+        id Int64 DEFAULT 0,
+        traversal_path String DEFAULT '0/',
+        version DateTime64(6, 'UTC') DEFAULT NOW(),
+        deleted Boolean DEFAULT false
+      )
+      ENGINE=ReplacingMergeTree(version, deleted)
+      PRIMARY KEY id
+      SETTINGS index_granularity = 512; -- lower granularity so id lookups use less I/O
+    SQL
+  end
+
+  def down
+    execute <<-SQL
+      DROP TABLE IF EXISTS namespace_traversal_paths
+    SQL
+  end
+end
diff --git a/db/click_house/migrate/main/20250220192324_create_namespace_traversal_paths_mv.rb b/db/click_house/migrate/main/20250220192324_create_namespace_traversal_paths_mv.rb
new file mode 100644
index 0000000000000000000000000000000000000000..8c1dd06b06a5b96274f58cf9468adcfdaaa21056
--- /dev/null
+++ b/db/click_house/migrate/main/20250220192324_create_namespace_traversal_paths_mv.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class CreateNamespaceTraversalPathsMv < ClickHouse::Migration
+  def up
+    execute <<-SQL
+      CREATE MATERIALIZED VIEW namespace_traversal_paths_mv
+      TO namespace_traversal_paths
+      AS
+      SELECT
+          id,
+          if(length(traversal_ids) = 0,
+             toString(ifNull(organization_id, 0)) || '/',
+             toString(ifNull(organization_id, 0)) || '/' || arrayStringConcat(traversal_ids, '/') || '/') as traversal_path,
+          _siphon_replicated_at AS version,
+          _siphon_deleted AS deleted
+      FROM siphon_namespaces;
+    SQL
+  end
+
+  def down
+    execute <<-SQL
+      DROP VIEW IF EXISTS namespace_traversal_paths_mv
+    SQL
+  end
+end