【发布时间】:2017-04-20 01:09:08
【问题描述】:
我的数据库中有一个表,它存储有关用户可用性的信息,其中有 21 个可用性空档:一周中的每一天都有 3 个。它看起来像这样:
CREATE TABLE user_availability(
id int(11) primary key increments,
user_id int(11),/*foreign key*/
day_mon tinyint(1),
day_tues tinyint(1),
day_wed tinyint(1),
day_thurs tinyint(1),
day_fri tinyint(1),
day_sat tinyint(1),
day_sun tinyint(1),
eve_mon tinyint(1),
eve_tues tinyint(1),
eve_wed tinyint(1),
eve_thurs tinyint(1),
eve_fri tinyint(1),
eve_sat tinyint(1),
eve_sun tinyint(1),
late_mon tinyint(1),
late_tues tinyint(1),
late_wed tinyint(1),
late_thurs tinyint(1),
late_fri tinyint(1),
late_sat tinyint(1),
late_sun tinyint(1)
);
起初这似乎是一个好主意,可以非常简单地提取特定 user_id 的可用性并简单地映射到表单等,但我意识到这是一个糟糕的设计,数据位于错误的位置,有效地强制了表之间的关系在应用程序而不是数据库中处理。
我的新设计是有 2 张桌子:
create table user_availabilty(
id int(11) primary key increments,
user_id int(11),/*foreign key*/
time_slot tinyint(2)/*foreign key*/
);
create table time_slots(
id tinyint(2) primary key,
name varchar(20)
);
这有什么问题吗?如果有一天我的梦想成真并且我拥有数万用户,那么每个用户的表中可能有 21 行是否会成为问题?
【问题讨论】:
-
“成本”将保持不变,因为这些项目的数量是不变的。那么目的是什么,这些信息的预期用途是什么?查询是什么样的?
-
预期用途是将承包商与租用人匹配。 “查询会是什么样子?”好点子!我开始回复
select distinct user_id from usr_avail where time_slot = 1 and time_slot=2,我认为这在提议的想法中不起作用。嗯,这并不理想
标签: database-design relational-database