取消SQL Server表的规范化以提高性能

取消SQL Server表的规范化以提高性能,sql,sql-server,database-performance,denormalization,Sql,Sql Server,Database Performance,Denormalization,需要数据库设计建议 我们的客户机正在运行SQL Server 2000/2012,作为客户机-服务器系统的服务器部分。我们大约有120张桌子。到目前为止,我们的设计非常稳定、可扩展和优化 其中包括一个约会表、一个用户表和一个在这两者之间创建多对多关系的表。这样,对于每个约会,我们可以设置哪些用户应该参加该约会 create table Appointments ( ID int not null identity(1,1), StartDate datetime not null

需要数据库设计建议

我们的客户机正在运行SQL Server 2000/2012,作为客户机-服务器系统的服务器部分。我们大约有120张桌子。到目前为止,我们的设计非常稳定、可扩展和优化

其中包括一个约会表、一个用户表和一个在这两者之间创建多对多关系的表。这样,对于每个约会,我们可以设置哪些用户应该参加该约会

create table Appointments (
    ID int not null identity(1,1),
    StartDate datetime not null,
    EndDate datetime not null,
    ...
)

create table Users (
    ID int not null identity(1,1),
    UserName nvarchar(100) not null,
    ...
)

create table Appointments_Users (
    ID int not null identity(1,1),
    UserID int not null,
    AppointmentID int not null
)

alter table Appointments_Users add constraint FK_Appointments_Users_AppointmentID foriegn key (AppointmentID) references Appointments (ID)

alter table Appointments_Users add constraint FK_Appointments_Users_UserID foriegn key (UserID) references Users(ID)
当我们查询约会以获得X时间跨度的约会列表时,问题就开始了。如果我们想看到参与每个约会的用户的逗号分隔列表,我们需要一个函数来接收约会Id,并用参与者名称连接一个字符串。这对性能有一定的影响(虽然影响不大)

我们现在开始遇到更多的问题,我们正在为约会添加另一个列,该列将保存连续的用户列表,仅用于查看目的:

alter table Appointments add UsersString nvarchar(max)
这需要在约会和用户上触发触发器,以便无论何时将用户添加到约会或从约会中删除,无论何时用户名更改,字符串都会更改。我们仍然会保留当前的结构,因为它很好地规范化了,并且更适合搜索


我们想知道这是否值得这么麻烦。。。以前有人这样做过吗?

值得这么麻烦吗?可能不会。“以逗号分隔的用户列表”是一个显示对象,而不是数据对象。首先,您的数据库不应该处理此问题,您的UI应该!您是否对约会有适当的索引?您需要处理多少行?总的来说,这对我来说并不沉重。。。您是如何实现连接的?无论如何乍一看,我宁愿调整你的方法,然后触发:-)你的表上有索引吗?使用触发器,您只需将性能问题从查看器移动到editorI,它会建议您在对精心设计的表进行非规范化之前优化索引!!!说真的,你不会相信有多大的性能提升潜力。我建议你问另一个问题,在其中包括你想提高谁的性能的查询。包括表的定义。除了非规范化之外,可能还有其他的可能性。