在SQL中创建评分表

时间:2016-11-01 12:09:21

标签: sql asp.net asp.net-mvc database entity-framework

在我的网站上,我有一张用户填写的评分表。他们通常会在评分表上有10个项目,每个项目都有自己的分数。我想以最佳方式设计这个以便将来扩展。如果我希望将来在评分表上有更多或更少的项目?

以下是我现在所拥有的:

public class Scoresheet
        {
            public int ScoresheetId { get; set; }
            public int DistanceAway1 { get; set; }
            public int score1 { get; set; }
            public int DistanceAway2 { get; set; }
            public int score2 { get; set; }
            public int DistanceAway3 { get; set; }
            public int score3 { get; set; }
            public int DistanceAway4 { get; set; }
            public int score4 { get; set; }
            public int DistanceAway5 { get; set; }
            public int score5 { get; set; }
            public int DistanceAway6 { get; set; }
            public int score6 { get; set; }
            public int DistanceAway7 { get; set; }
            public int score7 { get; set; }
            public int DistanceAway8 { get; set; }
            public int score8 { get; set; }
            public int DistanceAway9 { get; set; }
            public int score9 { get; set; }
            public int DistanceAway10 { get; set; }
            public int score10 { get; set; }
        }

这样做是否更好,或者将所有10个分数和距离放在同一行是否更好?我宁愿把它们放在同一行,因为我可以将这一行直接拉成一个模型。我原本以为这样做,所以我可以很容易地改变得分表上有多少个插槽,但它看起来并没有真正的好处,特别是因为我正在使用MVC开发而且我将永远需要整个评分表。

请帮助,我可以将所有数据放在一行中作为评分表吗?这是一个好习惯吗?

这是我想要提出的建议,但是因为每个得分都有不同的目的,所以会有所不同。

public class Scoresheet712
    {
        public int Scoresheet712ID { get; set; }
        public virtual ICollection<Scoresheet712Item> Scoresheet712Items { get; set; }
    }

喜欢这个?

select *,sum(marks) as marks 
from your_table 
where san not in (select san from your_table where is_goodDegree=0 ) 
group by san,temp_key; 

1 个答案:

答案 0 :(得分:0)

我倾向于同意@Stephen Muecke的灵活性和可扩展性,你真的需要两个sql表。

public class Scoresheet
{
    public int ScoresheetId { get; set; }
    public string ScoresheetName { get; set; }
    public ICollection<ScoresheetItem> ScoresheetItems { get; set; }
}

Public class ScoresheetItem
{
    public int ScoresheetItemId { get; set; }
    public int Score { get; set; }
    public int Distance { get; set; }
    //Navigation properties
    public int ScoresheetId { get; set; }
    public Scoresheet Scoresheet { get; set; }
{

这将允许您根据需要使用任意数量的项目构建新的Scoresheet。以下示例显示了用法。

//Create a new Scoresheet
Scoresheet scoresheet712 = new Scoresheet()
{
    ScoresheetName = "Score Sheet 712",
    ScoresheetItems = new List<ScoresheetItem>()
};
//Add a ScoresheeItem to Scoresheet
scoresheet712.ScoresheetItems.Add(new ScoreSheetItem()
{
    Score = 10,
    Distance = 150
});

请记住,在您的视图中,您不需要使用数据模型,您始终可以添加数据传输对象(Scoresheet_DTO)并为您的评分表制作平面结构,如果它确实使显示更容易/更好,只需一定要使用nullable integers

更新许多关系

对于多对多关系,如果在代码中正确设置,它将自动创建连接表。 Scoresheet类保持不变,但ScoresheetItem类对Relationship / Navigation属性的改动很小。

Public class ScoresheetItem
{
    public int ScoresheetItemId { get; set; }
    public int Score { get; set; }
    public int Distance { get; set; }
    //Navigation properties
    public ICollection<Scoresheet> Scoresheet { get; set; }
{

如需进一步的帮助,我建议您查看此Entity Framework Tutorial