jjzjj

python - 在日历 : CPU vs Database 中重复 "events"

coder 2023-08-24 原文

我正在从头开始构建一个日历系统(要求,因为我正在使用一种特殊类型的日历以及公历),我需要一些逻辑方面的帮助。我正在用 Django 和 Python 编写应用程序。

本质上,我遇到的逻辑问题是如何尽可能巧妙地保留尽可能少的对象,而不会耗尽 CPU 周期选项卡。我觉得多态性可以解决这个问题,但我不确定如何在这里表达它。

我有两个基本的事件子集,重复事件和一次性事件。

重复事件会有订阅者,人们会收到有关他们的更改的通知。例如,如果类(class)被取消或转移到不同的地址或时间,订阅的人需要知道这件事。有些事件每天都会发生,直到时间结束,不会被编辑,并且“只是发生”。问题是,如果我有 一个 对象来存储事件信息及其重复策略,那么取消或修改系列中的一个事件真的会把事情搞砸,我将不得不以某种方式考虑到这一点,让订阅者了解更改并将系列作为一个逻辑组保持在一起。

悖论:为系列中的每个正常事件生成唯一的事件对象直到时间结束(如果它无限重复)如果它们都将存储相同的信息则没有意义;但是,如果系列中的单个事件发生任何更改,我几乎必须在数据库中创建一个不同的对象来表示取消。

有人可以帮我解决这里的逻辑问题吗?这真的在扭曲我的思想,我真的无法再正常思考了。我真的很想就如何解决这个问题提供一些意见,因为重复事件也不是最简单的逻辑事情(每隔一天重复一次,或者每个 M/W/F,或者每个月的第一个 M,或者每 3 个月一次,或每年一次在这个日期,或每周一次在这个日期,或每月一次在这个日期,或在星期二上午 9:00 和星期四上午 11:00,等等)我会也有助于理解重复事件的最佳逻辑路径。

这里有一个关于如何做到这一点的想法:

class EventSeries(models.Model):
    series_name = models.TextField()
    series_description = models.TextField()
    series_repeat_policy = models.IHaveNoIdeaInTheWorldOnHowToRepresentThisField()
    series_default_time = models.TimeField()
    series_start_date = models.DateField()
    series_end_date = models.DateField()
    location = models.ForeignKey('Location')

class EventSeriesAnomaly(models.Model):
    event_series = models.ForeignKey('EventSeries', related_name="exceptions")
    override_name = models.TextField()
    override_description = models.TextField()
    override_time = models.TimeField()
    override_location = models.ForeignKey('Location')
    event_date = models.DateField()

class EventSeriesCancellation(models.Model):
    event_series = models.ForeignKey('EventSeries', related_name="cancellations")
    event_date = models.TimeField()
    cancellation_explanation = models.TextField()

这似乎有点道理,但如上所述,这现在正在毁掉我的大脑,所以任何事情似乎都行得通。 (另一个问题和问题,如果有人想修改系列中所有剩余的事件,我到底该怎么办!?!?我想我可以更改'series_default_time'然后为所有过去的实例生成异常实例来设置它们到原来的时间,但是 AHHHHHH!!!)

将其归结为三个简单、具体的问题,我们有:

  1. 我怎样才能拥有一系列重复事件,同时允许对单个事件进行取消和修改对整个系列的其余部分进行修改,同时在数据库中存储尽可能少的对象绝对必要,从不提前为个别事件生成对象?
  2. 我如何才能以高度可定制的方式重复事件,而不会失去理智,因为我可以允许事件在 number of ways 中重复,但再次使事情变得简单并尽可能少地存储对象?
  3. 我怎样才能做到以上所有的事情,允许在每个事件系列上进行切换,以防止它在 holiday 上失败时发生。 ?

最佳答案

这可能会成为一场激烈的讨论,因为日期逻辑通常比乍看起来要难得多,而且每个人都会有自己的想法如何让事情发生。

我可能会牺牲一些数据库空间并让模型尽可能简单(例如,不必为系列定义异常)。重复条件可以是一些必须解析的简单术语(取决于您的要求)或 - KISS - 只是下一个事件发生的间隔。

从这里您可以生成“下一个”事件,它将复制重复条件,并且您可以根据实际需要生成尽可能多的 future 事件(定义一些 future 的最大时间窗口来生成事件但生成它们仅当有人实际上查看有问题的时间间隔时)。这些事件可以有一个指向其父事件的指针,因此整个系列是可识别的(就像链表一样)。

模型应该有一个指标,是否取消了单个事件。 (事件保留在数据库中,以便能够将事件复制到 future )。取消整个系列会删除事件列表。

编辑:other answers提到了the dateutil package用于区间构建和解析,看起来真的很不错。

关于python - 在日历 : CPU vs Database 中重复 "events",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7313246/

有关python - 在日历 : CPU vs Database 中重复 "events"的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  5. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  6. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  7. 使用 ACL 调用 upload_file 时出现 Ruby S3 "Access Denied"错误 - 2

    我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file

  8. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  9. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  10. ruby - 如何关闭 ruby​​ gem "Spreadsheet?"中的文件 - 2

    下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11

随机推荐