2

我正在尝试为网站设计域模型的特定部分。

我遇到的问题是用星期几 ( Day) 和时隙 ( TimeSlot)表示一种可用性矩阵。

的可能值为Day

  • 周一
  • 周二
  • 周三
  • ...

的可能值为TimeSlot

  • 上学之前
  • 早晨
  • 中午
  • 下午
  • 放学后
  • 晚上
  • 夜间

目前,我有一个 JPA 实体,其中包含上述两个枚举(DayTimeSlot)作为字段:

@Entity
public class DayToTimeSlot {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column(name = "id")
  private Long id;

  @NotNull(groups = { Default.class, Validation.AdvertisementCreation.class })
  @Enumerated
  private Day day;

  @NotNull(groups = { Default.class, Validation.AdvertisementCreation.class })
  @Enumerated
  private TimeSlot timeSlot;
}

DayToTimeSlot然后我用所有可能的值/组合填充参考表。

最后,我有一个具有以下实例的Advertisement实体:@ManyToMany java.util.SetDayToTimeSlot

@ManyToMany
private Set<DayToTimeSlot> dayToTimeSlots;

这导致advertisement_day_to_time_slots连接表可以非常快速地增长

没有更好的方法来模拟这个可用性矩阵吗?

4

1 回答 1

2

我想您在表中只有 7Days * 7 TimeSlots = 49 个条目,DayToTimeSlot然后您只在广告表中引用它们。

为了保持完全的灵活性,我没有看到任何更好的方法来模拟可用性矩阵。但是您的问题似乎是关联表。我会给自己提出以下问题:它的增长速度有多快?未来5年你会达到100万吗?在这样 100 万个条目的表中进行搜索并不是什么大问题。

独立于您对最后一个问题的回答,您可以考虑缓存DayToTimeSlot表。

此外,如果您真的不想通过 搜索AdvertismentDayToTimeSlot您可以将关联保存为 String 字段,Advertisment并在调用 getter 时加载它们getDayToTimeSlots()。例如,在保存Advertisment您遍历整个 DayToTimeSlot 集时,构建一串表单:"MONDAY_BEFORE_SCHOOL, TUESDAY_NOON,..."并保存它。在加载一个Advertisment你处理字符串以创建集合。当然,在这种情况下,您将删除@ManyToMany引用。

但另一个可行的解决方案如下(如果每个工作日都有一个条目TimeSlot):如果您只想Advertisment按天搜索,或者如果您不介意编写更复杂的查询,那么您可以添加 7 个新字段:mondayAvailability, tuesdayAvailability, 到Advertisment实体,将数据保存在那里并摆脱 @ManyToMany 关系..

于 2013-09-20T12:47:09.767 回答