Технически, можно конечно вообще не описывать. Дали JSON и крутись как хочешь - в базе жсон, в программе жсон, на клиенте жсон. Но часто это неудобно и хочется его сначала перегнать во что-то прям сильно более специфическое для предметной области. Из
{"something": "special"}
в
Special :: Something
. И ещё столько раз, сколько того потребует достижение удобной работы. Ноль, один или более - не думаю, что это важно.
Я не знаю что именно там говорили на ютубе, но это похоже на вопрос наличия некоторой схемы, которую можно интерпретировать разными способами для разных целей и в разное время.
Можно сделать тип
data Something = Special | Ordinary | Composite This That
а потом при выгрузке использовать Generics, тайпклассы, TemplateHaskell или что-нибудь ещё чтобы получить код который будет из БД перекладывать в язык.
С бизнес-логикой всё ещё проще - код это данные, а данные это код. Есть EDSL на уровне хостового языка и логику ты пишешь на хаскеле, компилить и держать рядом с проектом. А есть DSL не использующие рантайм и к ним нужно прикручивать свою интерпретацию и сериализацию и хранить где угодно.