将工作日和时间表存储在数据库中

时间:2016-11-05 10:43:32

标签: database

我有以下数据(这不是数据库中的真实表,它只是我需要存储在我的数据库中的每个帖子的一组信息):

X = yes / true
O = no  / false

Weekday   | Morning | Day | Evening | Night |
---------------------------------------------
Monday    |    X    |  O  |    O    |   X   |
Tuesday   |    X    |  O  |    O    |   X   |
Wednesday |    O    |  O  |    X    |   X   |
Thursday  |    O    |  X  |    O    |   O   |
Friday    |    X    |  X  |    X    |   X   |
Saturday  |    O    |  O  |    X    |   O   |
Sunday    |    X    |  X  |    X    |   O   |

我应该如何将这样的数据存储在数据库中?我对数据库设计不太熟悉,而且我想到的所有可能的方法都浪费了很多空间。规范化不是必需的。

我不需要查询这些数据,我只需要将它有效地存储在父对象/实体中。

2 个答案:

答案 0 :(得分:0)

您可以考虑创建一个包含28列的表,每列包含4列,对应于每天的4 。类似的东西:

CREATE TABLE <name> ( SUNDAY_MORNING VARCHAR(1) ,
                      SUNDAY_DAY     VARCHAR(1) ,
                      SUNDAY_EVENING VARCHAR(1) ,
                      SUNDAY_NIGHT   VARCHAR(1) ,
                      MONDAY_MORNING VARCHAR(1) ,
                      MONDAY_DAY     VARCHAR(1) ,
                      MONDAY_EVENING VARCHAR(1) ,
                      MONDAY_NIGHT   VARCHAR(1) ,
                      ...
                    ) ;

当然,可能需要定义KEY,但不可能根据提供的信息提出任何建议。

根据您对SPACE的关注,这种结构将占用比您想象的更多的空间。

答案 1 :(得分:0)

根据您的说法,我创建了一个包含4列(早,日,傍晚,夜晚)和主键的表格,以引用各个数据集(例如您所拥有的数据集)示出)。然后我会为每个行条目使用bitfield。例如,周一= 1,周二= 2,周三= 4,周四= 8,周五= 16,周六= 32,周日= 64。

您提供的数据集(此处为PK 001)可以保存在一行中:

 
 PK       | Morning | Day | Evening | Night |
001          83        88    116       23

早上值是83,因为星期一(1)+星期二(2)+星期五(16)+星期日(64)= 83.

您只需要使用可以存储最多128位数的数据类型。这取决于您使用的数据库,但许多数据库具有可用的二进制(64)类型。

然后你会使用按位&amp;运算符以测试某一天是否由特定值表示:

83(早上价值)&amp; 16(星期五)= 16(星期五,因此是真的)
88(日值)&amp; 4(星期三)= 0(因此为假)
116(晚间价值)&amp; 32(星期六)= 32(星期六,因此为真)

或者,您可以为每周的每一天创建一个位域列,其值为Morning = 1,Day = 2,Evening = 4,Night = 8.

您的给定数据集将在数据库中表示为单行:

 PK   | Mon | Tue | Wed | Thu | Fri | Sat | Sun |
 001     9     9     12    2     15    4     7