diff --git a/db/post_migrate/20250224074639_add_approvals_project_id_index.rb b/db/post_migrate/20250224074639_add_approvals_project_id_index.rb
new file mode 100644
index 0000000000000000000000000000000000000000..afde48c08c4c5b96eac373d3edce220e48b17ed9
--- /dev/null
+++ b/db/post_migrate/20250224074639_add_approvals_project_id_index.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddApprovalsProjectIdIndex < Gitlab::Database::Migration[2.2]
+  disable_ddl_transaction!
+  milestone '17.10'
+
+  INDEX_NAME = 'index_approvals_on_project_id'
+
+  def up
+    add_concurrent_index :approvals, :project_id, name: INDEX_NAME
+  end
+
+  def down
+    remove_concurrent_index_by_name :approvals, INDEX_NAME
+  end
+end
diff --git a/db/post_migrate/20250224074659_add_approvals_project_id_fk.rb b/db/post_migrate/20250224074659_add_approvals_project_id_fk.rb
new file mode 100644
index 0000000000000000000000000000000000000000..0c35e3273b3068c55de6a02c5121fc38d51c06dd
--- /dev/null
+++ b/db/post_migrate/20250224074659_add_approvals_project_id_fk.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class AddApprovalsProjectIdFk < Gitlab::Database::Migration[2.2]
+  disable_ddl_transaction!
+  milestone '17.10'
+
+  def up
+    add_concurrent_foreign_key :approvals, :projects, column: :project_id, on_delete: :cascade
+  end
+
+  def down
+    with_lock_retries do
+      remove_foreign_key :approvals, column: :project_id
+    end
+  end
+end
diff --git a/db/schema_migrations/20250224074639 b/db/schema_migrations/20250224074639
new file mode 100644
index 0000000000000000000000000000000000000000..9e09a394ef7c8899ff9714ab2a943e9d6d7c18da
--- /dev/null
+++ b/db/schema_migrations/20250224074639
@@ -0,0 +1 @@
+2631c6b29c8bc28fab1ad8665c076b55938ae7f168bd820bfe8df0327e5f39e5
\ No newline at end of file
diff --git a/db/schema_migrations/20250224074659 b/db/schema_migrations/20250224074659
new file mode 100644
index 0000000000000000000000000000000000000000..cccd20668663910c729e8d590b3565b9e8ed3e61
--- /dev/null
+++ b/db/schema_migrations/20250224074659
@@ -0,0 +1 @@
+2e50706103444c53aa8d1ade1664ac267253b0edbc3669cb1ce110045d335250
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 5b6ce385a002759f62f4092d3c2305ac680a9323..7aa9e1f8da0e40532f36096791f0e50946de288a 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -31672,6 +31672,8 @@ CREATE INDEX index_approval_rules_code_owners_rule_type ON approval_merge_reques
 
 CREATE INDEX index_approvals_on_merge_request_id_and_created_at ON approvals USING btree (merge_request_id, created_at);
 
+CREATE INDEX index_approvals_on_project_id ON approvals USING btree (project_id);
+
 CREATE UNIQUE INDEX index_approvals_on_user_id_and_merge_request_id ON approvals USING btree (user_id, merge_request_id);
 
 CREATE INDEX index_approver_groups_on_group_id ON approver_groups USING btree (group_id);
@@ -40268,6 +40270,9 @@ ALTER TABLE ONLY user_member_roles
 ALTER TABLE ONLY boards_epic_board_labels
     ADD CONSTRAINT fk_cb8ded70e2 FOREIGN KEY (group_id) REFERENCES namespaces(id) ON DELETE CASCADE;
 
+ALTER TABLE ONLY approvals
+    ADD CONSTRAINT fk_cbce403122 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE;
+
 ALTER TABLE ONLY slack_integrations
     ADD CONSTRAINT fk_cbe270434e FOREIGN KEY (integration_id) REFERENCES integrations(id) ON DELETE CASCADE;