动态表的复合外键,不良实践

时间:2014-03-09 19:53:57

标签: sql sql-server entity-framework

首先,我不是DBA,我是C#开发人员。我正在开发一个非常复杂的Web应用程序,我想从一个可靠的数据库开始。所以这是我的问题: 我正在尝试创建一个设置表,该表将保存多个对象的设置。即:用户设置,季节设置,联赛设置,团队设置。

不是为每个人创建一个表,而是希望将所有内容保存在“设置”表中,但我无法弄清楚如何创建外键。

我的方法是在Settings表中有三列:TableName PrimaryKey ID。这三列将创建一个引用相应对象的复合键。我的方法被认为是不好的做法还是我走在正确的轨道上?有没有办法可以做到这一点仍然适用于实体框架?

2 个答案:

答案 0 :(得分:1)

这是我处理此问题的方法。

enter image description here

在此图中,ConfigId是主键,在Person表中用作FK,如EyeColor,BloodType,PersonType等等。这些列还包含Check约束,以确保除了眼睛颜色或基于ConfigType存储的相应列之外没有任何值。然而,这是以更广泛的数据类型为代价的,可能是smallint or int instead of tinyint

唯一不同的是,我在这种情况下将这些设置称为ConfigType {User,Team,Season etc.},任何扩展都可以通过继承概念在子表中使用ConfigId作为FK创建另一个表来完成。

答案 1 :(得分:1)

如果使用继承,默认情况下EF将为整个层次结构使用一个表。这称为表每层次结构或TPH

public abstract class Setting
{
   public string Key { get; set; }
   public string Value { get; set; }
}

public class UserSetting : Setting
{
   public int UserId { get; set; }
   public virtual User User { get; set; } 
}

public class SeasonSetting : Setting
{
   public int SeasonId { get; set; }
   public virtual Season Season { get; set; }
}