我有以下数据(这不是数据库中的真实表,它只是我需要存储在我的数据库中的每个帖子的一组信息):
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 |
我应该如何将这样的数据存储在数据库中?我对数据库设计不太熟悉,而且我想到的所有可能的方法都浪费了很多空间。规范化不是必需的。
我不需要查询这些数据,我只需要将它有效地存储在父对象/实体中。
答案 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