0

概述:

我有一个表“类别”,大部分用于对产品进行分类,目前看起来像这样:

CREATE TABLE [dbo].[Category]
( 
CategoryId int IDENTITY(1,1) NOT NULL, 
CategoryNode hierarchyid NOT NULL UNIQUE,
CategoryString AS CategoryNode.ToString() PERSISTED,
CategoryLevel AS CategoryNode.GetLevel() PERSISTED,
CategoryTitle varchar(50) NOT NULL,
IsActive bit NOT NULL DEFAULT 1
)

该表被大量查询以显示购物网站上的类别层次结构(通常是每个页面视图),并且可以包含大量项目。

我在我的数据层中使用实体框架。

问题:

我需要添加可能是相当大的“描述”,它可能以网页的全部内容的形式出现,我想知道是否应该将其存储在相关表中而不是将其添加到鉴于实体框架将 100% 的时间将“描述”列拖出数据库,而现有的类别表在 99.5% 的时间里我只需要 CategoryTitle 和 CategoryId。

通常我不会担心实体框架的开销,但在这种情况下,我认为考虑它可能很重要。我可以使用存储过程中的视图或复杂类型来解决此问题,但这意味着我希望避免进行大量重构。

我只是想知道是否有人对这种情况有任何想法、建议或想要拍我的手腕......

编辑:

我应该补充一点,我犹豫设置辅助表的原因是因为我不喜欢添加一个与 Category 表具有 1 对 1 关系的附加表的想法 - 这似乎有点毫无意义。但我也不是 DBA,所以我不确定这是否是可接受的做法。

4

2 回答 2

1

您可以将列放在表中,然后创建一个涵盖所有其他列的索引。这样,当您使用当前模式进行所有查找时,将使用索引。

这个结构的关键词是覆盖索引:http ://en.m.wikipedia.org/wiki/Database_index#Covering_index

于 2012-10-24T13:48:38.493 回答
0

出于不增加类别表中记录大小的简单原因,我将存储在不同的表中。由于这种 VARCHAR 列而增加的记录大小将减少可以容纳给定磁盘页面(通常大小为 4KB)的记录数量,从而增加要获取到主内存进行搜索的页面数量,从而增加磁盘数量访问,影响查询执行时间。

我会将其存储在不同的表中(即将类别表垂直划分为最常访问的列和不常用的列),并OneToOne在应用程序层与包含不常用的实体定义关系列,作为主类别实体中的成员,将获取类型设置为 LAZY。

于 2012-10-24T12:14:33.190 回答