在数据库中构建星期几的最佳方法是什么?

时间:2011-02-24 18:47:35

标签: sql database-design

这是标准化的事情,但我希望我必须掌握一周中的日期信息。用户将选择每一天并设置开始时间和结束时间。我需要将此信息存储在数据库中。我可以简单地在表中添加14个字段,它可以工作(MondayStart,MondayFinish,TuesdayStart等)。这似乎不是

4 个答案:

答案 0 :(得分:5)

不要将数据库设计为与UI匹配。

我保持系统工作的时间可以为一周中的每一天输入数据。这并不意味着你以这种方式存储它。

您需要一个供用户使用的表和一个有时间的表

User_T
  User_ID

Time_log_T
   User_ID
   Start_dt (datetime)
   End_dt (Datetime)

一切都可以从中得到。

如果您想每天办理一次登记,请在User_ID上创建一个唯一约束TRUNC(start_DT)。这将处理包裹天的第三班。 RDBMS不能表示给定User_ID的下一个start_dt是>该用户的MAX(End_DT)...您必须在代码中执行此操作。当然,如果您允许输入或更正前几天的记录,则需要以更复杂的方式验证它们是否不重叠。

想想你在这些表中抛出的所有查询;这将在99%的时间内击败14列。

答案 1 :(得分:2)

Users 
  id
  ...etc...

Days
  id
  day nvarchar (Monday, Tuesday, etc)
  start_time datetime
  end_time datetime
  user_id

如果您只想允许特定的日子或不那么天,那么您也可以在一天中的某天到一天中的某一天实施一致性以确保一致性

Days
  id
  day_of_week_id
  ...etc...

DaysOfWeek
  id
  name

答案 2 :(得分:1)

您可以创建一个包含3列的表 - 一个用于当天(这将是主键),一个用于开始时间,一个用于结束时间。

然后,您每周的每一天都会有一行。

如果您在每天存储每个用户的开始和结束时间,则可以使用例如用户ID的列扩展它(在这种情况下,主键是用户ID和星期几)......或类似的东西,以满足您的需求。

答案 3 :(得分:0)

我不认为将数据移动到另一个表可以完成任何事情。仍然会有一对一(主要记录到14个领域)的关系。它会更复杂,运行速度更慢。

你的直觉很好,但在这种情况下,我认为你最好将数据留在表格中。过度规范化是一件坏事。