Well, I basically agree with Rainlover.
If there is a need for some other candidate data within that table to be functionally unique, and in my experience it tends to be a compound series of columns, then I constrain it with a unique index. I have no problem with doing this nor see any real downside to it. It's not unknown for these indexes to require tweaking from time to time as assumptions or the underlying data change and in some cases I have multiple unique indexes on a table, they're rare, but they do sometimes occur.
Users don't have to worry about duplicate data because the application handles it for them and where duplicates should not be able to occur the relevant indexes or constraints are applied to the table and ensure that it isn't an issue.
Ultimately I have no real issue with natural Primary keys, but I do think that surrogate values should always be used as foreign keys. It simplifies the design as they'll never be modified and it makes the foreign key explicit.
All my tables use a tablenameId column [as primary keys] and all foreign Key columns are named for the primary key to which they refer.
e.g. An Account table has the following columns:
AccountId
CustomerId
Date
SortCode
AccountNumber
Balance
CompanyId
Knowing nothing else about the database I'd suggest that you can infer a lot about the immediate structure of that database based on those columns and that one sentence description.
If you think that you shouldn't be able to add the same date, sortcode and Accountnumber combination to the table, try it and see what happens.
The surrogate keys from a user point of view are meaningless, they exist purely to simplify maintenance of the database and improve performance. I don't care if they're sequential, have gaps etc and, like Rainlover, I rarely expose my users to these columns, certainly not in the application layer so that there is no chance that someone will try to assign meaning to them.