pixelplumber
Functions with a once schedule run 'once' - so they are never repeated, not even when an application updates or the server restarts. If you remove the once schedule and create a new one, it will run again - but again, only once ;)
So with a once schedule, you do not need to worry about blocking repeat execution. But in general, yes, I would use a relation and store/update a value to check on the next run and abort the operation if it was already done.
Regarding unique identifies - for this purpose, the UUID type is especially useful, which can be automatically created as default values on record creation, or later via backend functions.