Возможно ли, что один столбец является внешним ключом для другой таблицы - PullRequest
0 голосов
/ 06 июля 2019

Я начинаю писать приложение чата.Сначала я создал модель базы данных.Но я столкнулся с некоторой проблемой.Проблема заключается в том, что если отправитель отправил сообщение получателю, если получатель находится в автономном режиме, сервер должен сохранить сообщение для отправки, когда получатель находится в сети.Но есть одна проблема: сервер должен сохранять тип сообщения (голос, видео или фото и т. Д.).Может быть, это неправильный подход, что сервер сохраняет VoiceMessageId, VideoMessageId или PhotoMessageId.В этом случае этот столбец может быть null.

Но я хочу узнать, прежде чем создавать базу данных, возможно ли, что на один столбец ссылается больше таблицы.

Если у вас есть дополнительные рекомендации по этой структуре базы данных, напишите pls.Спасибо всем

Database 
 -Users
   -Name
   -Surname
   -Age
   -JoinedAt 
   -IP
-Server
   -SenderId
   -ReceiverId
   -MessageType  (Message,VoiceMessage or VideoMessage)
   -Status (Arrived or not  -- Boolean)



 -Messages
   -SenderId   (Must Bind to UserId)
   -ReceiverId (Must Bind to UserId)
   -MessageContent (Hash)
   -SentAt

 -VoiceMessages
   -SenderId
   -ReceiverId
   -Voice (Unknown)
   -Size
   -SentAt


 -PhotoMessages
   -SenderId
   -ReceiverId
   -Photo (VARBINARY(MAX))
   -Size
   -SentAt

 -VideoMessages
   -SenderId
   -ReceiverId
   -Video (VARBINARY(MAX) or FilePath)
   -Size
   -SentAt

1 Ответ

0 голосов
/ 06 июля 2019

Я согласен с @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, сообщающий вам, к какому типу сообщения оно относится, и коду вашего приложения просто необходимо соответствующим образом преобразовать и обработать содержимое сообщения.

Преимущество этого дизайна заключается в том, что вы можетеТеперь добавляйте новые типы контента, не влияя на схему базы данных, только код приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...