Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 时隙数据库设计_Mysql_Database_Database Design - Fatal编程技术网

Mysql 时隙数据库设计

Mysql 时隙数据库设计,mysql,database,database-design,Mysql,Database,Database Design,我正在创建一个数据库,需要允许预订资源从开始时间到结束时间在特定的一天。例如,我有11个羽毛球场。这些球场的预订时间为1小时,也可以是非常长的时间。从早上6点到晚上12点,每个球场一天可以预订18次。(考虑到每次预订一小时)。订票的价格每天都在变化,例如早上的费用比白天的费用高。周末费用比平日费用多 现在我的问题是,是否建议预先填充插槽,然后根据可用性为用户预订。但在本例中,对于abobe示例,如果我需要存储下一个月的插槽,那么我必须在没有任何实际预订的情况下提前存储11*18*30=5940条

我正在创建一个数据库,需要允许预订资源从开始时间到结束时间在特定的一天。例如,我有11个羽毛球场。这些球场的预订时间为1小时,也可以是非常长的时间。从早上6点到晚上12点,每个球场一天可以预订18次。(考虑到每次预订一小时)。订票的价格每天都在变化,例如早上的费用比白天的费用高。周末费用比平日费用多

现在我的问题是,是否建议预先填充插槽,然后根据可用性为用户预订。但在本例中,对于abobe示例,如果我需要存储下一个月的插槽,那么我必须在没有任何实际预订的情况下提前存储11*18*30=5940条记录。每个午夜我都需要运行脚本来创建插槽。如果没有俱乐部增加,这个数字可能会变得巨大。这样的系统设计好吗?如果没有,那么在这些场景中有什么更好的设计呢

club name||court || date || start_time || end_time || status || charge ||

a           c1    20/04/2015   6:00        7:00       available
a           c1    20/04/2015   7:00        8:00       available
.
.
.
a           c1    20/04/2015   11:00       24:00      available

.
.
a           c11   20/04/2015   11:00       24:00      available

从数据维护的角度来看,有一个带球场的表(每个球场1条记录)和一个带预订的表(每个预订1条记录)可能更有效

BOOKING
记录中应该有一个指向
球场的外键
一个预订开始日期/时间和一个预订结束日期/时间。它还将包含有关谁预订的信息,这可能是
客户表的外键,也可能是填写姓名等,具体取决于您的业务运作方式

现在我的问题是,是否建议预先填充插槽,然后根据可用性为用户预订。但在本例中,对于abobe示例,如果我需要存储下一个月的插槽,那么我必须在没有任何实际预订的情况下提前存储11x18x30=5940条记录。每到午夜,我需要运行脚本来创建插槽。如果没有俱乐部增加,这个数字可能会变得巨大

对。这是一种可怕的方法。因为你所说的原因,还有更多的原因

  • 储存非事实是荒谬的

  • 大量非事实的储存是不合理的

  • 如果需要编写简单的代码是一个问题,那就正视这个问题,提高你的编码技能,这样就不会有问题了(而不是为了满足你的编码技能,将数据库降级为原始的归档系统)

请注意,您所建议的是每个法庭的日历(作为一个可视化或结果集,这并不是不合理的),其中大多数时段都是空的(可用)

这样的系统设计好吗

不,太可怕了

这不是一个设计。这是一个没有设计的实现

如果没有,那么在这些场景中有什么更好的设计呢

club name||court || date || start_time || end_time || status || charge ||

a           c1    20/04/2015   6:00        7:00       available
a           c1    20/04/2015   7:00        8:00       available
.
.
.
a           c1    20/04/2015   11:00       24:00      available

.
.
a           c11   20/04/2015   11:00       24:00      available
我们使用数据库。考虑到它无与伦比的地位和您的平台,特别是关系数据库

我们只存储你需要的事实,关于你需要参与的真实世界的事实。我们需要从想象我们必须做的工作所需要的东西(数千个日历,部分为空)中解脱出来,将数据视为数据,并且只将其视为数据。包括所有规则和约束

此后,确定事实或不确定事实是非常容易的。我可以为您提供所需的关系数据库,但您必须能够编写SQL代码,以便有效地使用数据库

数据模型 试试这个:

这是一个IDEF1X数据模型。IDEF1X是关系数据库建模的标准。请注意,每一个小滴答;缺口和标记;乌鸦脚;实线与虚线;正方形与圆角;意味着非常具体和重要的事情。请参阅。如果您不理解符号,您将无法理解或使用该模型

我包括:

  • 仅存储事实(保留)。非事实或不存在事实(可用性)很容易确定

  • club\u resource\u slot.duration键中的duration
    允许任何持续时间,而不是假设一小时,这可能会改变。它在任何情况下都是必需的,因为它限定了时间段

  • 资源\u代码,
    而不是法院编号。这允许保留任何俱乐部资源(以及球场号码),而不仅仅是羽毛球或壁球场地。将来您可能会有会议室

  • Joel在<代码>费率表
中的回答在回答这个具体问题方面是非常正确的。我在模型其余部分的上下文中给出了一个更简单的形式(标准化程度较低,更容易编码)

如果您想要谓词,请询问

代码/概述 您似乎在编码的某些方面存在问题,我将首先解决这些问题:


但这种方法的问题是,如果我需要根据比赛、地点、日期和时间段找到球场的可用性,那么我必须加载所有俱乐部的费率表,如果有人已经预订了时间段,则查看实际的预订表。如果我提前保留了座位,然后有人预订,jst将状态更改为“预订”,这不是更好的方法吗。因此,查询将完全在数据库中执行,而不在内存中进行任何计算

  • 无论是否存在
    费率
    表,都不会产生问题。这可以通过连接来实现。所述步骤不是必需的

  • 请注意,您当然不需要“加载整个表”,但您可能需要加载一个表或其他表来填充下拉列表等

  • 当有人预订球场时,只需插入保留值()

  • 当有人取消预订时,只需删除预订值()

代码/数据模型
  • 打印保留的插槽的矩阵应该是o