Skip to content

Add unique contraint for parent link work_item_id

Jan Provaznik requested to merge jp-single-child-db into master

What does this MR do and why?

Each work item can have only single parent, so work_item_id can occur in parent links table only once.

Related to #367951 (closed) Complementary model MR: !92513 (merged)

Screenshots or screen recordings

DB migration output:

honza@pc ~/gitlab-development-kit/gitlab (jp-single-child-db)$ rake db:migrate
main: == 20220715054506 AddParentLinkUniqueWorkItemIndex: migrating =================
main: -- transaction_open?()
main:    -> 0.0000s
main: -- index_exists?(:work_item_parent_links, :work_item_id, {:unique=>true, :name=>"index_work_item_parent_links_on_work_item_id", :algorithm=>:concurrently})
main:    -> 0.0039s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0003s
main: -- add_index(:work_item_parent_links, :work_item_id, {:unique=>true, :name=>"index_work_item_parent_links_on_work_item_id", :algorithm=>:concurrently})
main:    -> 0.0121s
main: -- execute("RESET statement_timeout")
main:    -> 0.0003s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- indexes(:work_item_parent_links)
main:    -> 0.0023s
main: -- remove_index(:work_item_parent_links, {:algorithm=>:concurrently, :name=>"index_parent_links_on_work_item_id_and_work_item_parent_id"})
main:    -> 0.0035s
main: == 20220715054506 AddParentLinkUniqueWorkItemIndex: migrated (0.0294s) ========

ci: == 20220715054506 AddParentLinkUniqueWorkItemIndex: migrating =================
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- index_exists?(:work_item_parent_links, :work_item_id, {:unique=>true, :name=>"index_work_item_parent_links_on_work_item_id", :algorithm=>:concurrently})
ci:    -> 0.0029s
ci: -- execute("SET statement_timeout TO 0")
ci:    -> 0.0002s
ci: -- add_index(:work_item_parent_links, :work_item_id, {:unique=>true, :name=>"index_work_item_parent_links_on_work_item_id", :algorithm=>:concurrently})
ci:    -> 0.0068s
ci: -- execute("RESET statement_timeout")
ci:    -> 0.0002s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- indexes(:work_item_parent_links)
ci:    -> 0.0022s
ci: -- remove_index(:work_item_parent_links, {:algorithm=>:concurrently, :name=>"index_parent_links_on_work_item_id_and_work_item_parent_id"})
ci:    -> 0.0034s
ci: == 20220715054506 AddParentLinkUniqueWorkItemIndex: migrated (0.0194s) ========


honza@pc ~/gitlab-development-kit/gitlab (jp-single-child-db)$ rake db:rollback:main db:rollback:ci
main: == 20220715054506 AddParentLinkUniqueWorkItemIndex: reverting =================
main: -- transaction_open?()
main:    -> 0.0000s
main: -- index_exists?(:work_item_parent_links, [:work_item_id, :work_item_parent_id], {:name=>"index_parent_links_on_work_item_id_and_work_item_parent_id", :algorithm=>:concurrently})
main:    -> 0.0037s
main: -- execute("SET statement_timeout TO 0")
main:    -> 0.0003s
main: -- add_index(:work_item_parent_links, [:work_item_id, :work_item_parent_id], {:name=>"index_parent_links_on_work_item_id_and_work_item_parent_id", :algorithm=>:concurrently})
main:    -> 0.0141s
main: -- execute("RESET statement_timeout")
main:    -> 0.0003s
main: -- transaction_open?()
main:    -> 0.0000s
main: -- indexes(:work_item_parent_links)
main:    -> 0.0023s
main: -- remove_index(:work_item_parent_links, {:algorithm=>:concurrently, :name=>"index_work_item_parent_links_on_work_item_id"})
main:    -> 0.0034s
main: == 20220715054506 AddParentLinkUniqueWorkItemIndex: reverted (0.0310s) ========

ci: == 20220715054506 AddParentLinkUniqueWorkItemIndex: reverting =================
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- index_exists?(:work_item_parent_links, [:work_item_id, :work_item_parent_id], {:name=>"index_parent_links_on_work_item_id_and_work_item_parent_id", :algorithm=>:concurrently})
ci:    -> 0.0031s
ci: -- execute("SET statement_timeout TO 0")
ci:    -> 0.0003s
ci: -- add_index(:work_item_parent_links, [:work_item_id, :work_item_parent_id], {:name=>"index_parent_links_on_work_item_id_and_work_item_parent_id", :algorithm=>:concurrently})
ci:    -> 0.0167s
ci: -- execute("RESET statement_timeout")
ci:    -> 0.0004s
ci: -- transaction_open?()
ci:    -> 0.0000s
ci: -- indexes(:work_item_parent_links)
ci:    -> 0.0026s
ci: -- remove_index(:work_item_parent_links, {:algorithm=>:concurrently, :name=>"index_work_item_parent_links_on_work_item_id"})
ci:    -> 0.0037s
ci: == 20220715054506 AddParentLinkUniqueWorkItemIndex: reverted (0.0314s) ========

How to set up and validate locally

Numbered steps to set up and validate the change are strongly suggested.

MR acceptance checklist

This checklist encourages us to confirm any changes have been analyzed to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Jan Provaznik

Merge request reports