2015-02-11 2 views
1

я должен хранить следующие объекты в базе данных: устройстваEntity Framework 6 составной ключ (DateTime + внешний ключ)

  • точек измерения
  • измеренные значения

, где каждый устройство имеет одну или несколько точек измерения. Таблица измеренных значений будет хранить значения для каждой точки измерения каждые 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; } 
} 

Все значения в таблице измеренного значения должны быть уникальными в сочетании с TimeStamp и MeasuringPointID. Какой первичный ключ я должен определить для MeasuredTable?

ответ

1

это не однозначно code_first/EF.

С EF вы можете выбрать ПК, который приведет к созданию индекса кластера. Тогда вы можете/должны создать конкретный индекс (ы) для querie (ов)

Имхо, вы можете:

  • использовать рк личности (быстрее вставки)
    • создать (покрытие) индекс (точка, дата)
    • создать индекс (охватывающий) (дата, точка)
  • использовать рк (точку, счетчик), где счетчик идентичность или что-то вроде (max for point) + 1, или даже дату (но что, если 2 меры за одну миллисекунду?).
    • создать индекс (дата, точка)

По вашему транзакционной и параллелизмом давления max решение может быть довольно трудно реализовать.

В этом последнем случае вы будете иметь конфигурацию, как:

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

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

     /* ... */ 
    } 
} 
Смежные вопросы