我继承了一个使用 SQL Server (2008 R2) 的系统,其中包含两个涵盖系统消息传递的表。一条消息具有一对多的关系,它可以发送给多个用户。
主表 Messaging 如下所示:
Id (PK, auto increment)
Subject
MessageBody
CreatorEmployeeId
ConversationId
IsConversationStarter (bool)
辅助表 MessagingDetails 如下所示:
ID (PK, auto increment)
MessageId (FK to Messaging PK)
RecipientEmployeeId
ConversationId
IsRead (bool)
如果不清楚,则会将一条新消息放入 Messaging 表中,其中包含创建该消息的员工 ID,并创建新的对话 ID。然后将 X 行插入到 MessagingDetails 中,每个收件人一个,引用返回到 Messaging 表并使用相同的对话 ID。
任何新的回复看起来都一样,回复消息进入消息表,收件人详细信息使用相同的对话 ID 进入消息详细信息,这样您就可以将整个消息线程拉一个数字。
当您尝试计算您已创建或已发送给您的所有未读邮件时,这会变得很草率。这是一个现有的查询,它获取系统中其他用户发送给登录用户的所有未读消息,他们最初是在其中创建消息的:
SELECT * FROM dbo.Messaging m
INNER JOIN dbo.MessagingDetails m1 on m.Id = m1.MessageId
INNER JOIN dbo.MessagingDetails m2 on m1.ConversationId = m2.ConversationId
WHERE m1.RecipientEmployeeId = @employeeId
AND m.IsConversationStarter = 1
AND m.ConversationId = m1.ConversationId
AND m2.IsRead = 0
AND m2.RecipientEmployeeId == @employeeId
然后要查找员工创建但有未读回复的所有消息,您必须执行几乎相同的查询,将WHERE
子句的第一部分换成:
m.CreatorEmployeeId = @employeeId
我讨厌内部加入同一张桌子两次,一次是自己。鉴于上述架构,是否有更好的方法来编写这些查询?