Database design 数据库模式重构以优化性能和空间

Database design 数据库模式重构以优化性能和空间,database-design,sql-server-2012,database-schema,database-performance,Database Design,Sql Server 2012,Database Schema,Database Performance,我正在开发SQL SERVER 2012 Express Edition(我不是数据库架构师,只是c#dev),我有一个表,它有30列和1000多万行 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

我正在开发SQL SERVER 2012 Express Edition(我不是数据库架构师,只是c#dev),我有一个表,它有30列和1000多万行

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和rest将变为空/空。因此,分配的空间浪费在那里

  • 在当前模式中,我需要应用2,3索引来维护查询和过程的性能。它工作得很好,但不幸的是索引本身消耗了30%的存储空间,而且由于它的快速版,在几个月内就给我造成了文件大小限制问题

  • 现在我考虑将上面的表模式拆分为两个表,例如

    该表将保存每列的唯一代码,例如(P01、P02、P03)

    这将是实际的事务表,其中我将为每一列插入一个新行

    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)
    
    选项卡,每个列具有唯一代码

    ClientID     varchar(8) 
    PlantID      varchar(8) 
    PCODE        varchar(10)    
    PARANAME     varchar(15)    
    

    因此,我正在考虑更改表模式,是否有人能就如何设计这样的模式提出建议?

    我认为这种方法在您的情况下会起作用。确保每列都具有适当的数据类型以减小存储大小,如果可能,则避免将任何大列作为索引中的键列。请使用文本,而不是图像/链接作为文本,包括表和ERD。图像/链接中的文本内容无法搜索、剪切和粘贴。为什么要引入PCODE-PNAME/PARANAME间接寻址?仅仅是因为varchar(10)和varchar(15)之间的空间差异?
    ClientID     varchar(8) 
    PlantID      varchar(8) 
    PCODE        varchar(10)    
    PARANAME     varchar(15)