数据库设计和数据检索来自繁重的表格

时间:2012-06-01 07:41:26

标签: sql-server-2008 database-design query-optimization data-retrieval

我要求在数据库表中有612列。每种数据类型的列数为:

BigInt - 150(PositionCol1,PositionCol2 ............ PositionCol150)

Int - 5

SmallInt - 5

日期 - 150(SourceDateCol1,SourceDate2,............。SourceDate150)

DateTime - 2

Varchar(2000) - 150(FormulaCol1,FormulaCol2 .................. FormulaCol150)

位 - 150(IsActive1,IsActive2,..................。IsActive150)

当用户第一次进行导入时,数据存储在PositionCol1,SourceDateCol1,FormulaCol1,IsActiveCol1等中(其他日期时间,Int,Smallint列)。

当用户第二次进行导入时,数据存储在PositionCol2,SourceDateCol2,FormulaCol2,IsActiveCol2等中(其他日期时间,Int,Smallint列)......等等。

表中有一个ProjectID列,用于导入数据。

在开始导入过程之前,用户使用数据库列名称(PositionCol1,SourceDateCol1,FormulaCol1,IsActiveCol1)映射excel列名称,并将此映射存储在单独的表中;这样当检索到的数据可以显示在这些映射列名称下而不是DB列名称时。 E.g。

PositionCol1可能会映射到SAPDATA

SourceDateCol1可能会映射到SAPDATE

FormulaCol1可能会映射到SAPFORMULA

IsActiveCol1可能会映射到SAPISACTIVE

每天会在此表中添加40,000行,我的问题是,从长远来看,SQL能够处理大量数据的负载吗?

大多数情况下,一行将有大约200-300列的数据;在最坏的情况下,它将在所有612列中都有数据。考虑到这一点,我是否应该对设计进行一些更改以避免任何未来的性能问题?如果是这样,请建议可以做些什么?

如果我坚持我目前的设计,除了索引之外,我应该注意哪些方面能够在从这个庞大的表中检索数据时获得最佳性能?

如果我需要检索特定实体的数据,例如SAPDATA,我必须转到我的映射表,获取针对SAPDATA的数据库列名,即本例中的PositionCol1;并检索它。但是,通过这种方式,我将不得不编写动态查询。还有其他更好的方法吗?

1 个答案:

答案 0 :(得分:0)

不要坚持使用您当前的设计。你的重复群体是不自由的和自我限制的...当有人上传151次时会发生什么?规范化此表,以便每行具有一种类型而不是150.您不需要以这种方式进行映射,因为您可以从positioncol中选择SAPDATA而不必担心它是否为1-150。

您可能想要一个带有ID的PROJECTS表,一个带有ID的PROJECT_UPLOADS表和一个到PROJECTS表的FK。根据您的上述用例,此表将包含Position,SourceDate,Formula和IsActive。

然后你可以做像

这样的事情

选择p.name,pu.position来自PROJECTS p内部联接PROJECT_UPLOADS pu on pu.projectid = p.id WHERE pu.position ='SAPDATA'