【问题标题】:How to model this relationship efficiently如何有效地建模这种关系
【发布时间】:2015-04-08 23:56:45
【问题描述】:

我有一个锻炼表,每个锻炼可以是 5 种锻炼类型中的一种(例如,有氧运动、定时活动、重量、重量和计时的组合,其他)。每种不同的类型都以不同的方式存储数据(例如,有氧运动是强度和时间,计时只是以分钟为单位的时间,重量是组数 x 次数 x 重量,其他可能是其他)。

因此,我有一个锻炼表,但不确定如何为锻炼类型建模并存储每种锻炼类型的相关锻炼数据。每个练习将只有一个练习类型,并且每个练习类型可以属于多个练习。

我倾向于只使用一个运动表和一个运动类型表,并且具有多对一的关系,但我不知道如何最好地存储每个运动数据。

这将为 Entity Framework 6 和 MS SQL Server 建模。

【问题讨论】:

  • 听起来您的问题实际上是关于如何为运动类型建模。您已经有了 1:N 解决方案。

标签: sql sql-server database entity-framework


【解决方案1】:

我认为您的方案适合继承(使用 Table-per-Hierarchy),这是我建议的设计:

public Exercise 
{    
    public int ExerciseId {get;set;}

    [ForeignKey("ExerciseBaseTypeId")]
    public ExerciseBaseType ExerciseType {get;set;}

    [Required]
    public int ExerciseBaseTypeId {get;set;}

}

public ExerciseBaseType 
{
    public int BaseTypeId{get;set;}

    public Link<Exercise> Exercises {get;set;}

    //put other base properties that is common to all exercise types        
}

public Cardio : ExerciseBaseType {
    public string Intensity {get;set;}
    public int Time {get;set;}
}

public Timed : ExerciseBaseType {
    public int Duration {get;set;}
}

public Weight : ExerciseBaseType {
    public int Sets {get;set;}
    public int Weight {get;set;}
}

这是您的 dbcontext 文件:

public class ExerciseDbContext : DbContext
{

    public ExerciseDbContext()
        : base("ExerciseDatabase"){ }
}

public DbSet<Exercise> Exercises { get; set; }

public DbSet<ExerciseBaseType> ExerciseTypes { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     modelBuilder.Entity<Exercise>()
            .HasRequired(e => e.ExerciseBaseType)
            .WithMany(ebt => ebt.Exercises)
            .HasForeignKey(e.ExerciseBaseTypeId);
}

例如,让我们添加一个定时练习并将其附加到 id #1 的练习:

ExerciseDbContext db = new ExerciseDbContext();

var timedExercise = new Timed();
timedExercise.Duration = 60;
//set the other base properties

db.Exercises
  .Single(e => e.ExerciseId = 1)
  .ExerciseTypes.Add(timedExercise);

db.SaveChanges();

这有意义吗?

【讨论】:

  • 只是为了澄清一下,通过扩展 Cardio : BaseType...您的意思是扩展 Cardio : ExerciseBaseType 吗?
  • @Reza 是的!抱歉打错了,已修复!
  • 需要进一步澄清,因为我在尝试按照您的方式对其进行建模时遇到了困难。每个练习将有四种练习类型之一,但是与练习类型相关的数据是针对每个练习的。这意味着如果我有 10 个练习,每个练习可以是 5 种类型,但相关的度量(时间、体重等)将针对每个练习。因此,我认为上面的模型行不通
  • @Reza 我不确定你的意思,我添加了更多细节,你能检查一下吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多