对SQL Server表进行反规范化以提高性能

时间:2015-07-13 10:05:48

标签: sql sql-server database-performance denormalization

需要数据库设计建议!

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

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

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的函数,并使用参与者名称连接一个字符串。这对性能有一定影响(虽然不是那么多)。

我们现在开始遇到更多这方面的问题,我们正在考虑在Appointments中添加另一个列,它将保留用户的连续列表,仅用于查看目的:

alter table Appointments add UsersString nvarchar(max)

这将需要在Appointments_Users和Users上启用触发器,这样无论何时添加用户从约会中删除,并且每当用户名更改时,字符串也会更改。我们仍然会保留当前的结构,因为它很好地规范化并且更适合搜索。

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

0 个答案:

没有答案