Основные данные, которые могут относится только к одной таблице, и гарантированно к ней относятся (например, пользователь и пол), можно хранить в одной таблице (например, пользователи). Остальные данные можно как вы пишите, но если они не гарантированно присутствуют в таблицах, тогда можно использовать таблицу связку (pivot), в которой будет комбинация ключей (например, пользователь_ид - образование_ид)
Как вариант, при загрузке парсить документы и писать их в какую-нибудь базу данных и потом осуществлять поиск по этой базе, всё остальное на любой cms или микро-фреймворке