为这种数据设计表的方法

时间:2011-12-14 11:44:01

标签: php mysql

我有一个员工表和状态表。在员工表中,我有他的身份和姓名。并且在状态i中存储他一年中不同月份的状态。

它永远不会结束,即从今年开始到更多年,它将继续增长,即每一行代表一个月和一年的状态。因此,这需要花费大量时间在屏幕上加载12个月的数据作为其1对多关系。

所以我想将这些数据以序列化方式存储在与employee表相同的表中,即key将是month_year,value将是其状态。所以,如果我这样做,这个表会变大,造成空间问题吗?

如果我存储序列化数据并存储在其中,我应该使用什么数据类型。因为这个应用也可以使用3 - 4年。所以它在数组中有48个月的数据,与表格中的序列化相同。

****更新*****

如果这个月是11月,我将在今年10月到明年10月的屏幕数据上显示。所以这是最大的问题。

**** Update2 ***

这就是我应该如何在屏幕上显示我的数据,即每个员工12个月的状态。所以我在我的PHP代码中输入嵌套查询的问题。让一个员工循环进入第二个表并获取他的所有数据并显示。

enter image description here

2 个答案:

答案 0 :(得分:2)

序列化是一个糟糕的选择 您可以像这样考虑规范化: -

employee ( id, name ...);
employee_status (employee_id, year_month int(6), status boolean);

获取10月至10月的就业状况清单: -

select e.id, e.name, es.year_month, es.status
from employee as e
inner join employee_status as es
on e.id=es.employee_id
where es.year_month between "201110" and "201210";

答案 1 :(得分:1)

在状态表中,您可以创建15列:

  1. 12表示每个月(默认为NULL)
  2. 1年份INT类型
  3. 1表格的PK
  4. 1表示FK到用户表
  5. 当您存储状态时,只需将月份列从NULL更改为您的状态(可以直接存储在此表中,也可以将FK更改为另一个表)。

    要显示一年的结果,只需:

    SELECT * FROM status WHERE year = 2011 AND user_id = 1;

    您返回一行,每个月都有一个状态。然后,您可以过滤IS NULL以仅获取您具有状态的那些月份。

    您的表格仅为每位状态为一年的员工存储一行。