Sql server 优化聊天应用程序数据库

Sql server 优化聊天应用程序数据库,sql-server,indexing,chat,primary-key,Sql Server,Indexing,Chat,Primary Key,我使用数据库开发了一个简单的聊天应用程序。该项目的数据库如图所示 message表中的direction列仅用于确定user1是发送方还是user2是发送方 我使用此查询获取消息: SELECT TextContent,Direction FROM Messages WHERE User1 = 1 AND User2 = 2 ORDER BY Date User1和User2的值只是为了澄清 我有两个问题: 我没有为Messages表选择主键。我应该简单地选择ID列作为主键还是选择多

我使用数据库开发了一个简单的聊天应用程序。该项目的数据库如图所示

message表中的direction列仅用于确定user1是发送方还是user2是发送方

我使用此查询获取消息:

SELECT  TextContent,Direction FROM Messages
WHERE   User1 = 1 AND User2 = 2 
ORDER BY Date
User1和User2的值只是为了澄清

我有两个问题:

  • 我没有为Messages表选择主键。我应该简单地选择ID列作为主键还是选择多个列作为主键

  • 我应该在(User1,User2, 日期)列或(User1、User2、ID)列?。我应该创建群集索引还是非群集索引


  • 是的,您应该在ID列上定义主键聚集索引


    是的,您应该在(User1,User2,Date)上定义一个非聚集复合索引。如果将ID定义为聚集索引,则ID已“包含”在非聚集索引中。

    可能重复@mohan111,但这不是重复的。这里的问题更具体。我试图从链接中的问题中得到完整的答案,但我做不到。回答这个问题的程序员没有回答我的评论。回答得好,但是为什么ID应该是主键呢?它很复杂,我可以写一本关于这个主题的书。简单地回答你的问题。。。将主键作为ID(我假设您也将其设置为标识)将确保您不会意外地分配具有相同ID的两行。将其定义为聚集索引将确保在最后一页的末尾添加新行,从而防止页拆分。(页面分割是一个很长的话题,大多数人都不知道)…同样,使用一个整数列(4字节)由于聚集索引的值会在后台添加到所有非聚集索引行中,因此聚集索引而不是多列的组合将使表上的所有非聚集索引更小、更紧凑。感谢您的重播。