ASP如何组织每个项目具有多个已知值的数据库?

时间:2016-07-13 20:42:49

标签: asp.net asp.net-mvc database-schema

所以,我有一组表示球对象的数据。每个球是预定义的,即有已知数量的球对象,比如总共3个。每个球都有一个名字(字符串)。每个球可以是小型,中型或大型(枚举),可以是绿色或红色(枚举)。对于每种颜色的每种类型的每个球,我想要记录其最后10个位置(本例中的任意类型)。

所以,最初,我的想法是创建一个像这样的球对象表:

public class Ball {
    public int Id { get; set; }
    public string Name { get; set; }
    public Color Color { get; set; }
    public Size Size { get; set; }

    public virtual ICollection<BallHistory> History { get; set; }
}

public class BallHistory {
    public int Id { get; set; }

    public DateTime Date { get; set; }

    public int BallId { get; set; }
    public virtual Ball Ball { get; set; }
}

然而,这意味着我会有很多重复的球数据(例如Name),因为Name会针对每种尺寸和每种颜色重复,如下所示:

Ball Table:
Id   Name     Color   Size
0    MyBall   0       0
1    MyBall   0       1
2    MyBall   0       2
3    MyBall   1       0
4    MyBall   1       1
5    MyBall   1       2

History Table:
10 items with BallId = 0,
10 items with BallId = 1,
etc.

现在,由于类的设置方式,历史表将为每个球包含10个条目,其中每个条目将Id存储到Ball它是历史记录。问题实际上在于如何最好地创建类以最小化冗余数据。由于颜色和大小都是预先定义的,我想知道如果可能的话,如何最好地将这些数据分离到自己的表中。一个例子是复制Ball中的History属性,因此有一个SmallHistory,一个MediumHistory和一个LargeHistory。或者,也许最好以某种方式分离颜色和大小,而不是重复Name属性,只会为每种不同的颜色和大小重复一个整数(这将占用更少的数据)。

有什么想法吗?如果有任何需要澄清的话,请告诉我。在这个例子中,有3个球,每个球有2种颜色和3种尺寸选项(总共6个选项),对于每个具有特定选项的特定球,有10个历史项目。因此,在这个例子中,如果我没有弄错的话,Ball表中总共有18行,BallHistory表中有180行。在我的实际应用中,球的数量将在1,000左右,有7种颜色和2种尺寸选项,因此共有14,000个独特的球,每个球有10个历史记录条目,总计140,000个历史记录条目。当然,如果按照顶部提到的方式完成,那就是对Name属性的大量重复。

1 个答案:

答案 0 :(得分:0)

Shyju建议的答案是要么按原样保留并忽略重复空间(在我的情况下这很好,因为重复数量是在编译时/数据库创建时已知的常量),或者有一个中间表,可以保持颜色和大小。在这种情况下,历史表将引用中间表中的ID,而后者又会链接回球表中的名称。