我正在使用 SQL SERVER 2012 Express Edition ,(我不是数据库架构师,仅c#开发人员)我的表有30列和10+百万行
CID PID DID FID DateTimeStamp P01 P02 P03.....P30
CI1001 PI1001 DI1001 30 2017-04-02 9:14 12 230 230
CI1001 PI1001 DI1002 51 2017-04-02 9:14 34 3430 3430
CI1001 PI1001 DI1003 5 2017-04-02 9:14 56 340 340
CI1001 PI1001 DI1004 4 2017-04-02 9:14 78 340 340
CI1001 PI1001 DI1005 5 2017-04-02 9:14 33 340 340
当前架构所面临的问题是
我无法在此结构中实现动态列添加。 例如。有时在客户很少的地方,我需要在“ P01,P02 ... P30”旁边添加其他列,例如P31,P32。
不一定所有列(即P01,P02 ... P30)始终都具有值,P01,P02 ... P020可能会有值,其余列为空/空。因此分配的空间在那里浪费。
在当前模式中,我需要应用2、3索引来维护查询和过程的性能。它工作正常,但不幸的是索引本身消耗了30%的存储空间,并且自从其快速版本以来,它在几个月内为我创建了文件大小限制问题。
现在我正在考虑将上述表架构分为两个表,例如
该表格将为每一列保存唯一的代码,例如(P01,P02,P03)
CID PID PCODE PNAME
CI1001 PI1001 C1 P01
CI1001 PI1001 C2 P02
CI1001 PI1001 C3 P03
CI1001 PI1001 C4 P04
CI1001 PI1001 C5 P05
这将是实际的事务表,在其中我将为每一列插入一个新行。
CID PID DID FID PCODE DateTimeStamp Value
CI1001 PI1001 DI1001 30 C1 2017-04-02 9:14 230
CI1001 PI1001 DI1002 51 C2 2017-04-02 9:14 3430
CI1001 PI1001 DI1003 3 C3 2017-04-02 9:14 340
CI1001 PI1001 DI1004 4 C3 2017-04-02 9:14 340
CI1001 PI1001 DI1005 5 C5 2017-04-02 9:14 340
通过这种模式,我确定可以添加任何编号。在运行时的列数,但我不确定是否会因此获得任何性能和大小增长。 任何人都可以建议这种方法是否正确,或者对如何设计这种模式有任何建议?
已编辑
有了上面我解释的问题的模式3,我的问题已经解决,并且我对此进行了一些尝试,并且仅使用索引,所有查询集就可以顺利运行,因此性能不是问题,而是字面消耗的空间7倍于上一个。
下面是两个表的模式
主要交易表:-
ClientID varchar(8)
PlantID varchar(8)
DeviceID varchar(8)
FeederID tinyint
PCODE varchar(10)
Dates date
TimeStamp time(7)
VALUE decimal(19, 3)
带有每个COL唯一代码的标签
ClientID varchar(8)
PlantID varchar(8)
PCODE varchar(10)
PARANAME varchar(15)
所以我正在考虑更改表架构,有人可以建议任何有关如何设计这种架构的意见吗?