所以,我有一组表示球对象的数据。每个球是预定义的,即有已知数量的球对象,比如总共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属性的大量重复。
答案 0 :(得分:0)
Shyju建议的答案是要么按原样保留并忽略重复空间(在我的情况下这很好,因为重复数量是在编译时/数据库创建时已知的常量),或者有一个中间表,可以保持颜色和大小。在这种情况下,历史表将引用中间表中的ID,而后者又会链接回球表中的名称。