How to maintain customer addresses for Orders?
You have addresses in 3 tables.  Shrink that down to 1.  Then have a customer_address_id in the Customers table and ship_address_id in the Orders table.  Then, ship_address_id can be nullable.  Do not make all the fields in Addresses Nullable.  (Perhaps region and/or post_code can be left blank -- but make them DEFAULT '' instead of NULLable.

If a Customer is 'shipping' to himself, simply copy the customer_address_id into Orders.ship_address_id.

One more thing...  In order to not lose "old addresses", be careful about when (if ever) you change any row in Addresses.  You may end up with unused entries, but that is a small price to pay for the data integrity you require.