Recently I was working on a project. Some great software requirement documents were made. The software design was also looking great. So the project team worked and implemented the software design by writing the source code. The implemented software product was looking great.
The software testing team then started doing system testing. It was then that a major software defect got caught. One product feature was to delete account of any user from the system. But while testing it was discovered that this product feature was not working.
An investigation was made to find out the problem. It was then that it was discovered that it was happening due to faulty database design. Actually there were some child records related to users in some other database table. Due to presence of child records, the database was not allowing to delete master records related to user accounts.
This meant that the database design had to be changed. Now the foreign key definition was changed to include a clause which will delete child records when a master record was deleted from the database. After the database design was changed, the system was tested again. This time, the system worked fine and the defect was removed successfully.
No matter how good a software design looks, some unforeseen design problems are encountered on software projects. Even most experienced software designers make such mistakes.