Какое бы ни было лучшее решение, зависит IMHO не только от таблицы, но и от того, как это используется в других местах приложения.
Предполагая, что все комментарии связаны с каким-то другим объектом, предположим, что вы извлекаете все комментарии из этого объекта. В предложенном вами проекте извлечение всех комментариев требует выбора только из одной таблицы, что эффективно. Но это извлечение комментариев без извлечения информации о постере каждого комментария. Может быть, вы не хотите показывать это, или они уже кэшированы в памяти.
Но что, если вам нужно было получить информацию о постере при получении комментариев? Затем необходимо объединить две разные таблицы, и теперь результирующий набор записей загрязняется большим количеством значений NULL (для комментария профиля все пользовательские поля будут NULL). Код, который должен анализировать этот набор результатов, также может стать более сложным.
Лично я, вероятно, начну с полностью нормализованной версии, а затем денормализую, когда начну видеть проблемы с производительностью
Существует также совершенно другое возможное решение проблемы, но это зависит от того, имеет ли это смысл в данной области. Что если в приложении есть другие места, где пользователь и пользователь могут взаимозаменяемо пользоваться? Что если пользователь - это просто особый вид профиля? Тогда я думаю, что решение должно быть решено в основном в таблицах пользователя / профиля. Например (некоторые сокращенно псевдо-sql):
create table AbstractProfile (ID primary key, type ) -- type can be 'user' or 'profile'
create table User(ProfileID primary key references AbstractProfile , ...)
create table Profile(ProfileID primary key references AbstractProfile , ...)
Тогда в любом месте вашего приложения, где пользователь или профиль могут использоваться взаимозаменяемо, вы можете ссылаться на LoginID.