【问题标题】:Modelling multiple days of the week一周中的多天建模
【发布时间】:2011-02-01 00:21:34
【问题描述】:

这是我第二次遇到对象和工作日之间的一对多关系,我不确定我是否以最佳方式对其进行建模:

@Entity
MyObject {
    private int id;
    private String foo;
    private boolean monday;
    private boolean tuesday;
    private boolean wednesday;
    private boolean thursday;
    private boolean friday;
    private boolean saturday;
    private boolean sunday;
}

有人遇到过更好的方法吗?

我的要求是从数据库中检索与一周中当前日期匹配的所有 MyObject 实例,即无需检查多天,例如 mon=1 && tues=1

【问题讨论】:

    标签: java date dayofweek


    【解决方案1】:

    当对集合中有限数量的项目进行建模时,通常最好使用enum

    public enum DayOfWeek {
        Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
    }
    

    你可以像这样在你的课堂上使用它:

    class YourClass {
        private Set<DayOfWeek> activeDays;
    
        public void addActiveDay(DayOfWeek day){
            activeDays.add(day);
        }
    }
    ...
    
    yourclass.addActiveDay(DayOfWeek.Friday);
    

    【讨论】:

    • 如:MyObject { Set&lt;DayOfWeek&gt; activeWeekdays } ?
    • 数据库的开销似乎要大得多?要加入的额外表,可能是 7 个 varchar(9)。
    • @James,你可能是对的。这不会比以整数表示天数更好。但是,通常最好的做法是先设计好的代码,然后再考虑优化。你不能确定使用枚举会不会太慢。
    【解决方案2】:

    如何创建一个星期几的枚举,然后有一个私有数组来存储适用的日期?如果你想变得花哨,你可以有一些结构(比如Set,我认为它不允许重复)而不是防止重复的数组。

    如果您还将它与数据库一起使用,您正在运行哪种查询来获取数据,以及您使用的是哪种表结构(枚举解决方案可能不适用于所有数据库)?

    【讨论】:

    • 我会将 Mysql/InnoDb 与表 MyObjects(ID:int, FOO: varchar, MONDAY: bit, TUESDAY: bit ... SUNDAY: bit) 一起使用,然后查询例如 where MONDAY=1
    • @James:MySQL 有 Enums,它们似乎与 Java 兼容(虽然我自己没有尝试过):dev.mysql.com/doc/refman/5.0/en/… ...虽然这需要修改您现有的表和查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多