2015-02-11 103 views
1

我必须存储以下实体在数据库中:实体框架6复合键(日期时间+外键)

  • 设备
  • 测量点
  • 测量值

,其中每个设备有一个或多个测量点。测量值表格将存储每10分钟每个测量点的值。这张表格将在几年后拥有数百万条记录,并且必须通过测量点和时间戳进行有效搜索。您如何设计EF6 Code-First?

我的第一种方法是:

public class Device 
{ 
    public int ID { get; set; } 

    public int DeviceNumber { get; set; } 

    ... 

    public virtual ICollection<MeasuringPoint> MeasuringPoints { get; set; } 
} 

public class MeasuringPoint 
{ 
    public int ID { get; set; } 

    public int MeasuringPointNumber { get; set; } 
    ... 

    // Foreign key 
    public int DeviceID { get; set; } 

    public virtual Device Device { get; set; } 
} 

public class MeasuredValue 
{ 
    //public int Id { get; set; } ???? 

    public DateTime TimeStamp { get; set; } 

    // Foreign key 
    public int MeasuringPointID { get; set; } 

    public double Value; 

    public virtual MeasuringPoint MeasuringPoint { get; set; } 
} 

在测量值表中的所有值都必须在时间戳和MeasuringPointID的组合是唯一的。我应该为MeasuredTable定义什么主键?

回答

1

这不是唯一的code_first/EF相关。

有了EF,您可以选择一个PK来创建群集索引。然后,你可以/必须创建querie(S)

恕我直言特定指数(ES),您可以:

  • 使用的身份PK(快插)
    • 创建(覆盖)指数(点,日期)
    • 创建(覆盖)指数(日,点)
  • 使用PK(点计数器),其中计数器是一种身份或者类似的东西(max for point) + 1,甚至是日期(但如果两个度量在同一毫秒内呢?)。
    • 创建一个索引(日期,点)

根据您的交易和并发压力max解决方案可能是非常难以实现。

在这最后的情况下,你有这样的配置:

public class MeasuredValueConfiguration : EntityTypeConfiguration<MeasuredValue>{ 
    public MeasuredValueConfiguration() 
     : base() { 
     /* ... */ 

     HasKey(e => new {e.MeasuringPointID, e.Id});   

     /* ... */ 
    } 
}