首页 > 解决方案 > 一列是否有可能是不同表的外键

问题描述

我开始编写聊天应用程序。首先我创建了数据库模型。但是我遇到了一些问题。问题是如果发送方将消息发送到接收方离线的接收方,服务器必须在接收方在线时保存要发送的消息。但是有一个问题:服务器必须保存消息类型(语音、视频或照片等)。也许服务器保存的方法不正确VoiceMessageIdVideoMessageId或者PhotoMessageId。在这种情况下,此列可以是null

但是我想在创建数据库之前了解一列是否有可能被更多表引用。

如果您对此数据库结构有额外的建议,请写。谢谢你们

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

标签: sql-servertsql

解决方案


我同意@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,告诉你它是什么类型的消息,你的应用程序代码只需要适当地转换和处理消息内容。

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


推荐阅读