带有键

时间:2015-08-06 21:43:59

标签: php python mysql

我有一张看起来像这样的表

+----+----------+------------
| id | restaurant| ...       |
+----+----------+-----------+
|  1 | one       | ...       | 
|  2 | tow       | ...       | 

现在,对于我想在每个小时的操作中添加的餐馆。现在从我所看到的情况来看,有一个新专栏并将其称为小时数然后有一个varchar并且具有类似

的内容将会很糟糕
"9:00-22:00,10:00-20:00,10:00-21:00"

然后当我将这些数据提取到我的应用程序中之后,将它分成逗号来制作数组。不是100%肯定为什么这很糟糕,但我知道我不应该这样做吗?

所以我正在考虑制作一个名为“Restaurant_Hours”的新桌子并让它看起来像这样

+----+----------+------------+------------+
| id | restaurant| mon       |tue         | ect...
+----+----------+------------+------------+
|  1 | one       | 9:00-22:00|10:00-22:00 |
|  2 | tow       | ect.      | ect.       |

这种制作新桌子的策略是否像我最好的方式一样?这也不是正确的做事方式。然后餐厅将是我每个人的独特之处,所以我可以获得这样的时间吗?

1 个答案:

答案 0 :(得分:0)

我所想的基础是这样的:

CREATE TABLE `restaurant_hours` (
  `restaurant_hour_id` INT NOT NULL AUTO_INCREMENT,
  `restaurant_id` INT NOT NULL,
  `day_of_week` TINYINT NULL,
  `opens_at` TIME NOT NULL,
  `closes_at` TIME NOT NULL,
  `hours_desc` CHAR(16) NOT NULL DEFAULT ''
);

当然,restaurant_id应该是FOREIGN KEYrestaurantsid,而你可能想要UNIQUE约束(restaurant_id, day_of_week,hours_desc)。如果他们有特殊的假期时间,您可能希望将day_of_week == 0用作“旗帜”。

...或者,如果你真的有野心,还要引用某种“day_descriptions”表,其中1-7对应于周日至周六,而> = 8可以用来表示可能发生的事情。需要按年份(特定节假日)计算。

编辑:hours_desc的目的是“早餐”,“午餐”,“晚餐”等......

即使没有这个,查询“什么时候打开”的查询会是这样的:

SELECT r.restaurant 
FROM restaurant_hours AS rh
INNER JOIN restaurants AS r rh.restaurant_id = r.id
WHERE rh.day_of_week = DAYOFWEEK(@theWhen)
AND rh.opens_at < TIME(@theWhen) 
AND rh.ends_at > TIME(@theWhen)
;