After conversing with support, I understand that recently Guest Checkout has started giving the option for donor to share their details with charities.
Whilst this is a good idea, it has a system breaking effect on softwares that uses the Donor User Id as unique identifiers - such as our system.
After some digging, we can see that the Guest Donor User Id has existed since August 2018. At the time it made sense since all these donations were always anonymous in nature and our system had always processed those separately.
However with unique data to be shared with charities, such as email and postcode, it no longer makes sense to continue recycling the same Donor User Id.
In our case, since the donor no longer anonymous, our system now tries to manage the guest Donor User Id as a unique donor - but of course it's now suddenly seeing thousands of donations over the years by this single donor.
This can literally be fixed by simply assigning a new Donor User Id to a guest if they choose to share details with charities.
I understand if this could have an undesirable effect on your Donor table, but there are definitely tricks you can use to optimise this process without bloating the donor table.
Having a separate set of Donor User Ids with prefixes could work - but will most definitely break any other systems that stores the Donor User Id as an integer, so it's not a recommended approach.