Я согласен с @Larnu, столбец MessageTypeId - это путь.
Когда вы посмотрите на свой дизайн базы данных, вы заметите, что все типы сообщений имеют один и тот же столбец, за исключением вашегосодержание сообщения.Это означает, что вы можете разделить их на отдельные сущности / таблицы.
Таким образом, вы можете создать «общую» таблицу сообщений, содержащую данные о том, кому и когда вы ее отправили, таблицу поиска, содержащую другое сообщение.типы (Текст, Видео, Изображение, Голос и т. д.) и таблица, содержащая фактическое содержимое сообщения, а затем свяжите их следующим образом:
-MessageType
-MessageTypeId
-Description
-MessageContent
-MessageContentId
-MessageTypeId (FK to MessageType table)
-MessageContent (VARBINARY(MAX) - in this case you'll need to encode everything to varbinary, but this is something that can be handled differently)
-Size
-Message
-SenderId
-ReceiverId
-MessageContentId (FK to MessageContent table)
-SentAt
Теперь у вас есть таблица сообщений, которая ссылается на свой MessageContents, который определяетконтент и его размер, который в свою очередь ссылается на MessageType, сообщающий вам, к какому типу сообщения оно относится, и коду вашего приложения просто необходимо соответствующим образом преобразовать и обработать содержимое сообщения.
Преимущество этого дизайна заключается в том, что вы можетеТеперь добавляйте новые типы контента, не влияя на схему базы данных, только код приложения.