ASP 如何组织一个每个项目都有多个已知值的数据库?
ASP How to organize a database where each item has multiple known values?
所以,我有一组表示球对象的数据。每个球都是预定义的,即有已知数量的球对象,比如总共 3 个。每个球都有一个名字(字符串)。每个球可以是小、中或大(枚举),也可以是绿色或红色(枚举)。对于每种颜色的每种类型的每个球,我想要其最近 10 个位置的历史记录(此示例为任意类型)。
所以,最初,我的想法是创建一个 table 球对象,如下所示:
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; }
}
但是,这意味着我会有很多重复的球数据(例如名称),因为名称会针对每种尺寸和每种颜色重复,如下所示:
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.
现在,由于 类 的设置方式,历史记录 table 将包含每个球的 10 个条目,其中每个条目存储球的 ID,它是球的历史记录.问题实际上在于如何最好地创建 类 以最大限度地减少冗余数据。由于颜色和大小都是预定义的,我想知道如何最好地将这些数据分离到它自己的 table 中,如果可能的话。一个例子是在 Ball 中复制 History 属性,因此有一个 SmallHistory、一个 MediumHistory 和一个 LargeHistory。或者,也许最好以某种方式将颜色和尺寸分开,而不是重复名称 属性,每个不同的颜色和尺寸只重复一个整数(这样会占用更少的数据)。
有什么想法吗?如果有什么需要更多说明,请告诉我。在此示例中,有 3 个球,每个球有 2 个颜色和 3 个尺寸选项(总共 6 个选项),对于每个具有特定选项的特定球,有 10 个历史项目。所以,在这个例子中,Ball table 中共有 18 行,BallHistory table 中共有 180 行,如果我没记错的话。在我的实际应用中,球的数量约为 1,000 个,有 7 种颜色和 2 个尺寸选项,因此总共有 14,000 个不同的球,每个球有 10 个历史条目,总共有 140,000 个历史条目。当然,如果按照顶部提到的方式完成,那么名称 属性.
会重复很多次
正如 Shyju 所建议的那样,答案是要么保持原样并忽略重复项 space(这对我来说很好,因为重复项的数量是编译时已知的常量 time/database 创建时间),或者有一个中间 table 来保存颜色和大小。在这种情况下,历史记录 table 将引用中间 table 中的 ID,后者又 link 返回到球 table.
中的名称
所以,我有一组表示球对象的数据。每个球都是预定义的,即有已知数量的球对象,比如总共 3 个。每个球都有一个名字(字符串)。每个球可以是小、中或大(枚举),也可以是绿色或红色(枚举)。对于每种颜色的每种类型的每个球,我想要其最近 10 个位置的历史记录(此示例为任意类型)。
所以,最初,我的想法是创建一个 table 球对象,如下所示:
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; }
}
但是,这意味着我会有很多重复的球数据(例如名称),因为名称会针对每种尺寸和每种颜色重复,如下所示:
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.
现在,由于 类 的设置方式,历史记录 table 将包含每个球的 10 个条目,其中每个条目存储球的 ID,它是球的历史记录.问题实际上在于如何最好地创建 类 以最大限度地减少冗余数据。由于颜色和大小都是预定义的,我想知道如何最好地将这些数据分离到它自己的 table 中,如果可能的话。一个例子是在 Ball 中复制 History 属性,因此有一个 SmallHistory、一个 MediumHistory 和一个 LargeHistory。或者,也许最好以某种方式将颜色和尺寸分开,而不是重复名称 属性,每个不同的颜色和尺寸只重复一个整数(这样会占用更少的数据)。
有什么想法吗?如果有什么需要更多说明,请告诉我。在此示例中,有 3 个球,每个球有 2 个颜色和 3 个尺寸选项(总共 6 个选项),对于每个具有特定选项的特定球,有 10 个历史项目。所以,在这个例子中,Ball table 中共有 18 行,BallHistory table 中共有 180 行,如果我没记错的话。在我的实际应用中,球的数量约为 1,000 个,有 7 种颜色和 2 个尺寸选项,因此总共有 14,000 个不同的球,每个球有 10 个历史条目,总共有 140,000 个历史条目。当然,如果按照顶部提到的方式完成,那么名称 属性.
会重复很多次正如 Shyju 所建议的那样,答案是要么保持原样并忽略重复项 space(这对我来说很好,因为重复项的数量是编译时已知的常量 time/database 创建时间),或者有一个中间 table 来保存颜色和大小。在这种情况下,历史记录 table 将引用中间 table 中的 ID,后者又 link 返回到球 table.
中的名称