Выбираю СУБД. От неё сильно зависят возможности: типы данных, индексы, промежуточные таблицы.
Разбиваю куски данных на сущности - тематические наборы данных.
Раскидываю сущности по таблицам - определяю что именно за поля должны быть в каждой сущности, для чего они нужны, какие типы данных будут оптимальны.
Связываю сущности отношениями. Выясняю, действительно ли необходимы каскадные операции отношениям, или нет, где лучше сохранить устаревшие данные, где можно подчистить, а где нужно сохранять актуальные связи по id.
Оцениваю получившуюся структуру, оптимизирую её: денормализую некоторые сущности, добавляю данные в связи, где не хватает, добавляю служебные поля, индексы.
Далее гоняю несколько итераций в голове на типичные сценарии использования: где-то всплывает неоптимальность структуры, или типа поля, где-то отсутствие необходимого поля, где-то можно сохранить дополнительную информацию, которая сейчас не нужна, но в некоторых сценариях значительно ускорит выборку данных из БД.
Идеал все равно не получится, остальное допиливается миграциями по мере необходимости. Но самых крупных косяков можно избежать, как следует подумав что хранить, зачем, в каком виде, как это будет использоваться, как работает СУБД, как ей помочь.