Во-первых, несколько незначительных предложений с общей точки зрения проектирования:
Поскольку вы используете Pascal Case для имен полей, вы должны также использовать его для имен таблиц, чтобыбыть последовательным.Поэтому MESSAGE_COMMENT должно быть MessageComment
Не используйте повторно имя поля "Id", поскольку оно означает что-то свое в каждой таблице.Таким образом, «Id» в сообщении должно быть «MessageId», «Id» в MessageComment должно быть MessageCommentId и т. Д.
Если поле является внешним ключом, оно должно содержать имяполе, на которое он указывает.Таким образом, «CreatedBy» должно быть «CreatedByUserId», а «Recipient» должно быть «RecipientUserId».Помните, что чем точнее вы называете свои поля, тем меньше дополнительных комментариев и документации вам понадобится, и, следовательно, кому-то еще будет легче запутаться в понимании того, что предполагается.
Теперь,Что касается вопроса «является ли этот дизайн подходящим для X», вам нужно будет предоставить более подробную информацию о том, как вы представляете себе работу этой системы.Похоже, что Сообщение является родительским, тогда как любые ответы на него считаются MessageComments.Пока все выглядит хорошо.
Я не уверен, зачем вам нужен «ReadDate» в основной таблице сообщений, поскольку он также существует на более точном уровне в MessageRecipient.Если, конечно, вы не хотите отлавливать ПЕРВЫЙ раз, когда он читается, но вы все равно можете получить его из таблицы MessageRecipient, посмотрев на всех Получателей определенного сообщения.
Наконец, вам не следует даже иметь «MessageRecipientId»и используя «MessageId» и «RecipientUserId» в качестве составного первичного ключа.Это гарантирует, что вы можете иметь RecipientUserId для сообщения только один раз, без необходимости создавать дополнительный уникальный индекс для этих двух полей.