一栏是否可能是另一张表的外键

时间:2019-07-06 11:45:36

标签: sql-server tsql

我开始编写聊天应用程序。首先,我创建了数据库模型。 但是我遇到了一些问题。 问题是发件人是否向收件人处于脱机状态的收件人发送了消息,服务器必须保存要在收件人联机时发送的邮件。但是有一个问题:服务器必须保存消息类型(语音,视频或照片等)。 服务器保存VoiceMessageIdVideoMessageIdPhotoMessageId也许是不正确的方法。在这种情况下,此列可以为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 :(得分:0)

我同意@ 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

现在,您有一个Message表,该表链接到它的MessageContents,后者定义了内容及其大小,而后者又链接到MessageType,告诉您消息是什么类型的消息,您的应用程序代码只需要适当地转换和处理消息的内容即可

这种设计的好处在于,您现在可以添加新的内容类型,而不会影响数据库模式,仅影响应用程序代码。