Normalise and de-duplicate source and target branches for merge requests
<!--IssueSummary start-->
<details>
<summary>
Everyone can contribute. [Help move this issue forward](https://handbook.gitlab.com/handbook/marketing/developer-relations/contributor-success/community-contributors-workflows/#contributor-links) while earning points, leveling up and collecting rewards.
</summary>
- [Close this issue](https://contributors.gitlab.com/manage-issue?action=close&projectId=278964&issueIid=331827)
</details>
<!--IssueSummary end-->
In https://gitlab.com/gitlab-org/gitlab/-/issues/331523#note_583693337 we found we can save quite a bit of space by not storing source and target branches as separate values for every occurrence. Instead, we'd store the unique values in a separate table much like discussed in https://gitlab.com/gitlab-org/gitlab/-/issues/331823.
The logic for migrating and populating data at runtime would be more or less the same (if not the same), so please take a look at that issue for more information.
issue