具有多个日期信息的表的更好的数据库基础

时间:2014-12-23 12:03:26

标签: mysql database-design

您认为更好的基础是什么?"易于使用"使用SQL语法 - 第一个或第二个表? 请说明原因。

表一:

+----+--------------------------------------+
| id | date1      | date2      | date3      |
+----+------------+------------+------------+
| 1  | 2014-02-15 | 2014-03-24 | 2014-03-24 |
| 2  | NULL       | NULL       | 2014-08-15 |
| 3  | 2014-06-13 | NULL       | NULL       |
| 4  | 2014-01-10 | 2014-09-14 | 2014-01-12 |
+----+------------+------------+------------+

表二:

+----+------------+-------+-------+-------+
| id | date       | one   | two   | three |
+----+------------+-------+-------+-------+
| 1  | 2015-07-04 | true  | true  | false |
| 2  | 2014-06-13 | false | true  | false |
| 3  | 2014-11-11 | true  | false | false |
| 4  | 2017-03-02 | false | true  | true  |
+----+------------+-------+-------+-------+

(表中的内容在此示例中不匹配)

我只想知道当你只有一个日期字段和其他布尔字段而不是多个日期字段时是否更容易处理。例如,如果您想要this

之类的SELECT

2 个答案:

答案 0 :(得分:1)

这些都没有标准化。规范化是避免数据异常和保持干燥的好方法。

您的日期代表什么? “一个”,“两个”和“三个”代表什么?

我会选择这样的东西:

create table my_table (
  my_table_id int primary key,
  a_more_descriptive_word_than_date date not null,
  label text not null
);

数据如下所示:

id date       label
1  2014-12-23 one
2  2014-12-24 two
3  2014-12-25 three

答案 1 :(得分:1)

这取决于日期。

只是因为两个字段都是日期,所以没有告诉我们他们彼此之间要做什么,如果有的话。

如果三个日期完全不相关,并且在处理过程中永远不可互换,并且如果它们是不太可能经常变化的固定集合,例如"出生日期","雇用日期& #34;和"下一年度审核日期",然后我会将它们分成三个单独的字段。然后当你编写查询时,它会非常简单,比如

select employee_id, name from employee where next_annual_review_date='2015-02-01'

另一方面,如果您可能合理地编写一个可以搜索所有三个日期的查询,那么将日期分成另一个表,并使用标识特定日期的字段是有意义的。就像我为一个仓库系统创建了一个表,其中有一个与库存项目相关的日期 - 它到达仓库的日期,它出售的日期,库存,返回到仓库(因为客户退回它,因为例如),重新出售,丢失,损坏,修复等。这些日期可能有许多可能的顺序,其中许多可能会多次发生。就像物品可能被损坏,修理,然后再次损坏和修理,或者它可以被出售,退回,再次出售,然后再返回等等。所以我用"静态&#创建了一个库存项目表34;信息,如部件号,描述,以及用户描述该项目所需的bazillion代码,然后是单独的" stock事件"表与库存项目ID,事件代码,日期和各种其他东西。然后是另一个股票事件表,列出了包含描述的事件代码。

这样可以轻松构建查询,例如"列出过去四年中此项目发生的所有日期顺序"或者"列出11月添加到库存中的所有项目& #34;等等。

你的第二张桌子似乎是一个全面的坏主意。我不能想到有3个布尔字段的优势,而不是一个说明它是什么的字段。假设三个日期是出生日期,雇用日期和下一个审核日期。你可以为这些创建代码 - 也许1,2,3;也许B,H,R;随你。然后选择特定事件很容易,我猜:选择雇用=真实的日期与事件=' H'

的选择日期。

但是使用代码列出带描述的多个日期会更容易。您只需要一个代码和描述表,然后编写

select employee_name, event_code, date
from employee e
join employee_event ev on ev.employee_id=e.employee_id
join event v on v.event_id=ev.event_id
where ... whatever ...

但是对于布尔人来说,你需要一个三方案/何时。

添加新事件类型后会发生什么?使用事件代码,它只是一个数据更改:将enw记录添加到事件代码表中。使用布尔值,您需要更改数据库。

您可能会产生模糊数据的可能性。如果两个布尔都是真的,或者如果没有一个是真的,会发生什么?那是什么意思?事件代码可能会发生一整类错误。