0

我需要在我的数据库表中有 612 列。根据数据类型的列数是:

BigInt – 150 (PositionCol1, PositionCol2…………PositionCol150)

诠释 - 5

小整数 - 5

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

日期时间 - 2

Varchar(2000) – 150 (FormulaCol1, FormulaCol2………………FormulaCol150)

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

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

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

正在为其导入数据的表中有一个 ProjectID 列。

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

PositionCol1 可以映射到 SAPDATA

SourceDateCol1 可以映射到 SAPDATE

FormulaCol1 可以映射到 SAPFORMULA

IsActiveCol1 可以映射到 SAPISACTIVE

每天将在此表中添加 40,000 行,我的问题是,从长远来看,SQL 是否能够处理这么多数据的负载?

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

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

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

4

1 回答 1

0

Don't stick with your current design. Your repeating groups are unweildy and self limiting... What happens when somebody uploads 151 times? Normalise this table so that you have one of each type per row rather than 150. You won't need mapping this way as you can select SAPDATA from the positioncol without worring if it is 1-150.

You probably want a PROJECTS table with an ID, a PROJECT_UPLOADS table with an ID and an FK to the PROJECTS table. This table would have Position, SourceDate, Formula and IsActive given your use-case above.

Then you could do things like

select p.name, pu.position from PROJECTS p inner join PROJECT_UPLOADS pu on pu.projectid = p.id WHERE pu.position = 'SAPDATA'

etc.

于 2012-06-01T07:45:41.983 回答