Я согласен с вами, что бы мы ни делали, нет гарантии, что мы сможем избавиться от плохих или неверных данных. Особенно, но не только, если речь идет о пользовательском вводе. По моему опыту, такие же проблемы существуют в сложных интеграционных проектах, в которых вам приходится интегрировать и объединять (часто противоречивые) данные, полученные из разных систем.
Хорошая стратегия состоит в том, чтобы отделить вход от самой операционной системы. Во-первых, поместите предоставленные пользователем (или внешнюю систему) данные в отдельное хранилище данных (например, в другую схему). На втором этапе загрузите эти данные в оперативное хранилище данных, но только в том случае, если это соответствует строгим правилам (например, используйте программное обеспечение для проверки адреса для проверки данного адреса). Такой подход извлечения, преобразования, загрузки (ETL) довольно распространен в решениях хранилищ данных (DWH), но может быть применен программно и в транзакционных системах (по моему опыту).
Приведенный выше подход часто приводит к асинхронным процессам, в которых входные данные подставляются первыми и (возможно) в более позднее время внешняя сущность (пользователь или система) получает обратную связь, независимо от того, правильны ли ее данные.
РЕДАКТИРОВАТЬ: Для дальнейшего чтения я рекомендую взглянуть на концепции DWH. Хотя, возможно, вы не захотите создавать такую вещь, вы можете частично применить эти концепции:
http://en.wikipedia.org/wiki/Extract,_transform,_load
http://en.wikipedia.org/wiki/Data_warehouse
http://en.wikipedia.org/wiki/Data_cleansing