SQL数据库重新定位

bit*_*ego 1 sql database-design sql-server-2008

在最近的几天里,我打电话来替换我公司的前dba.总而言之,该公司负责计量数据存储.也就是说,自1996年以来,已经以不同的方式(txt,xls,然后访问等)测量和存储了许多变量.在去年,所有这些数据都必须存储在sql db(sql server 2008 r2)中,但是我发现了一个奇怪且不直接的情况在实践中,大约有30个表,每个表都有不同的列数.每列都是变量,在我们的数据库中存在300多个变量表的结构类似:id,siteid,date_of_meas,var1,var2,...,varN(复制30次)

首先,变量不是逻辑分组的(压力与温度等等),但最糟糕的是,每次创建一个新的var(取决于实际因素,这里没有什么有趣的讨论),前dba采取这种方式: 1.在现有表中添加一个新列(...如果一个表已有50列......怎么办?)2.写入数据你可以搞清楚,这种方式在我看来真的很疯狂

我会从头开始重新设计数据结构.这就是这样的情况:有一个包含所有现有变量的表(添加新变量没问题)我可以使用变量的id号,创建新表(逻辑上对它们进行分组......但总会有很多表)并使用这些外键插入数据.类似于以下内容:

CREATE TABLE [dbo].[MyMeteo](
[id_meteo] [int] IDENTITY(1,1) NOT NULL,
[varid] [int] NOT NULL,
[siteid] [int] NOT NULL,
[date] [smalldatetime] NOT NULL,
[value] [float] NULL,
Run Code Online (Sandbox Code Playgroud)

....

另一个问题是真正庞大的数据......因为数据每30分钟测量一次,在1年内测量数据为17520或17568.乘以15年,300个变量和200个站点...我在监视sql db是否仍然是正确的选择.非常感谢迭戈

Den*_*rdy 5

类似于以下内容:

CREATE TABLE [dbo].[MyMeteo](
[id_meteo] [int] IDENTITY(1,1) NOT NULL,
[varid] [int] NOT NULL,
[siteid] [int] NOT NULL,
[date] [smalldatetime] NOT NULL,
[value] [float] NULL,
Run Code Online (Sandbox Code Playgroud)

...是实体 - 属性 - 值模式的微小变化.这是一个模式.

您以前的DBA可能做得对:每次测量一行,每个变量作为一列.如果这意味着50个或更多列,那么这很重要.

如果需要,可以在单独的表中拆分逻辑组.实际上,不要:你会得到更复杂的查询计划和更慢的查询(有时慢得多,当按照存储在一个表中的条件进行排序时,按照存储在另一个表中的条件进行筛选),即对您的问题大致为零.

简而言之,最重要的是挖掘数据是多么简单.在表格之间拆分数据会使情况变得更糟.使用像你正在研究的那样的伪EAV商店会让事情变得更糟.

关于最后一点,SQL是正确的选择:160亿行虽然令人印象深刻,但对于现代数据库而言只是小于等级.