草庐IT

mysql - 时隙数据库设计

coder 2023-10-04 原文

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

现在我的问题是,是否建议预先填充插槽,然后根据可用性为用户预订。但是在这种情况下,对于 abobe 示例 如果我需要在接下来的 1 个月内存储插槽,那么我将不得不提前存储 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

最佳答案

Now my question is, is it advisable to pre-populate slots and then book it for user depending on the availability. But in this case for the abobe example If I need to store slots for next 1 month then I will have to store 11x18x30 = 5940 records in advance without any real bookings.Every midnight I will need to run script to create slots. If no of clubs increases this number can become huge.



是的。这是一种可怕的方法。出于你所说的原因,还有更多。
  • 非事实的存储是荒谬的
  • 存储大量非事实是不合理的
  • 如果需要编写简单的代码是一个问题,那就正视它,提升你的编码技能,使其不是问题(而不是将数据库降级为原始文件系统,以满足你的编码技能) .

  • 请注意,您所建议的是每个球场的日历(作为可视化或结果集并非不合理),其中大部分位置将是空的(可用)。

    Is this good design for such systems?



    不,这太可怕了。

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

    If not then what is the better designs in these scenerios.



    我们使用数据库。鉴于其无与伦比的地位,以及您的平台,特别是关系数据库。

    我们只存储您需要的那些关于您需要参与的现实世界的事实。我们需要摆脱对我们必须做的工作(数千个日历,部分空白)的可视化,而将数据视为数据,并且仅将其视为数据。包括所有的规则和约束。

    之后,确定事实或缺乏事实就变得非常容易了。我可以为您提供您需要的关系数据库,但您必须能够编写 SQL 代码,才能有效地使用该数据库。

    数据模型

    尝试这个:

    Resource Reservation Data Model

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

    我已经包括:
  • 仅存储事实(预订)。事实(可用性)的非事实或缺失很容易确定。
  • club_resource_slot.duration在 Key 中允许任何持续时间,而不是假设一小时,这可能会改变。它在任何情况下都是必需的,因为它界定了时隙。
  • resource_code,而不是法院号码。这允许保留任何俱乐部资源(以及球场号码),而不仅仅是羽毛球或 Squash 场。您将来可能会有 session 室。
  • Joel 的回复是关于 rate就回答该特定问题而言,表是非常正确的。我在模型其余部分的上下文中给出了一个更简单的形式(更少的规范化,更容易编码)。

  • 如果您想要谓词,请询问。

    代码/一般

    您似乎在编码的某些方面遇到了问题,我将首先解决这些问题:

    But the problem in this approach is if I need to find the availability of court based on game,location, date and time slot then I will have to load this rate table for all the clubs and the look into actual booking table if someone has already booked the slots. Is nt the better approach be if I keep the slots in advance and then someone book , jst change the status to booked. so That query will be performed entirely in DB without doing any computation in memory.


  • rate的存在表,与否,不会产生问题。这可以通过连接来完成。所描述的步骤不是必需的。
  • 请注意,您当然不需要“加载整个表格”,但您可能必须加载一个表格或其他表格才能填充下拉列表等。
  • 当有人预订法庭时,只需插入预订值 ()
  • 当有人取消预订时,只需 DELETE 预订 VALUES ()

  • 代码/数据模型
  • 打印 的矩阵保留插槽应该很明显,很简单。
  • 打印 的矩阵可用 或可用加上预留(您的日历视觉)需要投影。如果您不了解此技术,请阅读 this Answer .一旦你理解了这一点,代码就像[1]一样简单。
  • 您需要能够对子查询和派生表进行编码。
  • 确定一个时隙是保留还是可用需要一个简单的查询。我将提供一些示例代码来帮助您。没有指定“游戏”,我假设位置意味着俱乐部。
    IF (
        SELECT COUNT(*)                -- resources/courts reserved
            FROM reservation
            WHERE club_code = $club_code
            AND   date_time = $date_time
        ) = 0
    THEN PRINT "All courts available"
    ELSE IF (
            SELECT COUNT(*)            -- resources/courts that exist
                FROM club_resource_slot
                WHERE club_code = $club_code
                AND   date_time = $date_time
            ) = (
            SELECT COUNT(*)            -- resources/courts reserved
                FROM reservation
                WHERE club_code = $club_code
                AND   date_time = $date_time
            )
        THEN PRINT "All courts reserved"
        ELSE PRINT "Some courts available"
    

  • 请随时发表评论或提出问题。

    关于mysql - 时隙数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29868565/

    有关mysql - 时隙数据库设计的更多相关文章

    1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

      我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

    2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    3. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

      我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

    4. ruby - Ruby 有 `Pair` 数据类型吗? - 2

      有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

    5. ruby - 我如何添加二进制数据来遏制 POST - 2

      我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

    6. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

      无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

    7. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

      本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

    8. 使用canal同步MySQL数据到ES - 2

      文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

    9. ruby-on-rails - 创建 ruby​​ 数据库时惰性符号绑定(bind)失败 - 2

      我正在尝试在Rails上安装ruby​​,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf

    10. STM32读取串口传感器数据(颗粒物传感器,主动上传) - 2

      文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,

    随机推荐