Предположим, что имеется некоторая достаточно сырая идея, на основе которой нужно построить некоторый интернет-продукт. С чего можно начать? Года два-три назад, я бы действовал по следующей схеме:
И далее цикл повторяется с пункта b. При этом, оглядываясь на предыдущий опыт и изучая опыт коллег по цеху, видно, что в какой-то момент разработчик устает и дальнейшее перепроектирование системы приводит к неоптимальным решениям.
С одной стороны, отсутствие внятной (для программиста) картины процесса это плохо и казалось бы в такой ситуации не приходится ждать хороших результатов. С другой — это вполне жизненная ситуация, которая может быть объяснена не только особенностями заказчика, но и объективными причинами. Действительно, имея на руках хоть в какой-то степени готовый и живой продукт, где реализована логика и построены взаимосвязи сразу же всплывают те вопросы, которые не были и не могли быть продуманы заранее.
Для себя я нашел оптимальный подход, который позволяет минимизировать трудозатраты на этапе, пока нам не достаточно известны некоторые ключевые для реализации подробности. А они могут быть выяснены только после получения некоторой рабочей модели. Суть подхода состоит в том, что все информационные сущности мы храним в отдельных таблицах, но без разделения полей. В виде JSON массива. Это позволяет хранить объекты сколь угодно большой сложности.
Такой подход позволяет не трогать БД при изменении/добавлении полей и не тратить время на изменение и отладку запросов в новых условиях.Нам остается только изменение в чистой логике и проверки. В дальнейшем, при переходе от хранения JSON—запакованных данных к нормализованной структуре нам потребуется изменять практически только запросы, а логика и проверки остаются без изменений.
Зачем вообще может потребоваться переходить от NoSQL типа хранения к обычным таблицам? Для меня этот вопрос разрешается легко: пока я не могу назвать себя специалистом по MongoDB или чему-то подобному, для коммерческой разработки лучше пользоваться проверенными инструментами. Хотя, если иметь возможность выбора и если у нас в проекте отсутствует штат аналитиков (которые пишут SELECT * к нашей базе) а нашей базой не будут пользоваться сторонние сервисы, то можно все хранение вообще перевести на NoSQL-рельсы.
Итак, проектируя для начала всю структуру в стиле JSON-строк мы экономим время на отладке и значительно раньше можем получить некоторый законченный результат, имея который будут решены все необходимые вопросы для построения в достаточной степени законченной и разумной архитектуры.
Вот что имею сказать.