Log*_*man 6 database database-design
这是一个完全假设的问题:假设我有一个数据库,我需要为用户存储会员资格,这可以持续一段特定的时间(1个月,3个月,6个月,1年等).
有一个Memberships包含字段的表(每个日期存储为unix时间戳)是否更好?
user_id INT,start_date INT,end_date INT
或者将其存储为:
user_id INT,start_date INT,length INT
无论哪种方式,您都可以查询具有活动成员资格的用户(例如).对于后一种情况,每次运行查询时都需要执行算术,而前一种情况只需要计算一次结束日期(插入时).从这个角度来看,似乎前者的设计更好 - 但它有什么缺点吗?是否存在可以通过存储长度来避免的常见问题,这是通过存储日期无法避免的?
此外,unix时间戳是存储时间/日期数据时的方式,还是像DATETIME首选的那样?我遇到了两种数据类型(过多的转换)的问题,但通常会解决unix时间戳问题.如果首选像DATETIME这样的东西,这会如何改变我以前的设计问题的答案?
这实际上取决于您将针对您的日期运行什么类型的查询。如果查询涉及按开始/结束时间或日期范围进行搜索,然后开始/和日期,那么一定要选择第一个选项。
如果您对统计更感兴趣(平均会员期限是多少?有多少人是会员超过一年?)那么我选择了第二个选项。
关于过度转换 - 您正在使用哪种语言进行编程?Java/Ruby 在底层使用 Joda Time,它大大简化了日期/时间相关的逻辑。