Entity Framework 6个复合键(日期时间+外键)
Entity Framework 6 composite key (DateTime + foreign key)
我必须将以下实体存储在数据库中:
- 台设备
- 测量点
- 测量值
其中每个设备都有一个或多个测量点。测量值 table 将每 10 分钟存储一次每个测量点的值。这个 table 几年后将有数百万条记录,必须可以通过测量点和时间戳进行有效搜索。您将如何使用 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; }
}
测量值 table 中的所有值在 TimeStamp 和 MeasuringPointID 的组合中必须是唯一的。我应该为 MeasuredTable 定义什么主键?
这并非唯一 code_first/EF 相关。
对于 EF,您可以选择一个 PK 来创建集群索引。然后你 may/must 为查询创建特定的索引
恕我直言,你可以:
- 使用身份 pk(更快的插入)
- 创建(覆盖)索引(点、日期)
- 创建(覆盖)索引(日期、点)
- 使用 pk(点,计数器),其中计数器是身份或类似
(max for point) + 1
的东西,甚至是日期(但如果 2 个测量值在同一毫秒内怎么办?)。
- 创建索引(日期、点)
根据您的事务和并发压力,max
解决方案可能很难实施。
在最后一种情况下,您的配置如下:
public class MeasuredValueConfiguration : EntityTypeConfiguration<MeasuredValue>{
public MeasuredValueConfiguration()
: base() {
/* ... */
HasKey(e => new {e.MeasuringPointID, e.Id});
/* ... */
}
}
我必须将以下实体存储在数据库中:
- 台设备
- 测量点
- 测量值
其中每个设备都有一个或多个测量点。测量值 table 将每 10 分钟存储一次每个测量点的值。这个 table 几年后将有数百万条记录,必须可以通过测量点和时间戳进行有效搜索。您将如何使用 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; }
}
测量值 table 中的所有值在 TimeStamp 和 MeasuringPointID 的组合中必须是唯一的。我应该为 MeasuredTable 定义什么主键?
这并非唯一 code_first/EF 相关。
对于 EF,您可以选择一个 PK 来创建集群索引。然后你 may/must 为查询创建特定的索引
恕我直言,你可以:
- 使用身份 pk(更快的插入)
- 创建(覆盖)索引(点、日期)
- 创建(覆盖)索引(日期、点)
- 使用 pk(点,计数器),其中计数器是身份或类似
(max for point) + 1
的东西,甚至是日期(但如果 2 个测量值在同一毫秒内怎么办?)。- 创建索引(日期、点)
根据您的事务和并发压力,max
解决方案可能很难实施。
在最后一种情况下,您的配置如下:
public class MeasuredValueConfiguration : EntityTypeConfiguration<MeasuredValue>{
public MeasuredValueConfiguration()
: base() {
/* ... */
HasKey(e => new {e.MeasuringPointID, e.Id});
/* ... */
}
}