sql-server - 一列是否有可能是不同表的外键
问题描述
我开始编写聊天应用程序。首先我创建了数据库模型。但是我遇到了一些问题。问题是如果发送方将消息发送到接收方离线的接收方,服务器必须在接收方在线时保存要发送的消息。但是有一个问题:服务器必须保存消息类型(语音、视频或照片等)。也许服务器保存的方法不正确VoiceMessageId
,VideoMessageId
或者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
解决方案
我同意@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,告诉你它是什么类型的消息,你的应用程序代码只需要适当地转换和处理消息内容。
这种设计的好处是您现在可以添加新的内容类型而不会影响您的数据库架构,只影响应用程序代码。
推荐阅读
- amazon-web-services - 在创建新集群时,kOps 1.19 正在为“节点”创建 3 个不同的实例组,而不是单个 ig
- python - Python 的异步终止信号处理(signal.signal)如何工作?
- c# - 范围滑块的逻辑: min(min, max) 有效,但 max(min, max) 无效
- c# - VS Code 调试器无法为 .NET 控制台应用程序“步进”
- jena - Apache Jena Fuseki 是否支持集群或自动缩放?
- javascript - 试图找到所有正则表达式匹配的索引,但有些被遗漏了
- python - 如何在 read_excel 执行期间将时间值作为字符串获取?
- python - Pandas DataFrame 中布尔行的矢量化“真”值范围
- python - Pandas 拆分列表列表系列以查找字数/行
- java - 如何使用 couchbase Java SDK 获取使用 Arrays.asList(remove()) 删除的元素详细信息?