我开始编写聊天应用程序。首先,我创建了数据库模型。
但是我遇到了一些问题。
问题是发件人是否向收件人处于脱机状态的收件人发送了消息,服务器必须保存要在收件人联机时发送的邮件。但是有一个问题:服务器必须保存消息类型(语音,视频或照片等)。
服务器保存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
答案 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,告诉您消息是什么类型的消息,您的应用程序代码只需要适当地转换和处理消息的内容即可
这种设计的好处在于,您现在可以添加新的内容类型,而不会影响数据库模式,仅影响应用程序代码。