【问题标题】:Creating Scheduler App - process and concept questions创建调度程序应用程序 - 过程和概念问题
【发布时间】:2013-09-21 15:58:46
【问题描述】:

如果其他时候有人问过或回答过这个问题,我深表歉意 - 我认为我的搜索一直在试图在服务器上安排 PHP 任务的人中丢失,所以我找不到我在找的东西为。

因此,作为我的第一个自建应用程序(不是指导或指导的应用程序),我正在尝试构建一个营地调度程序。我已经构建了一些东西来登录,添加小屋/组或删除它们,添加活动/组或删除它们,并生成日期范围,并从该数据中选择您想要安排的那些事情,然后发送它到一个调度程序,然后创建一个新的 MySQL 表和......

这就是我不断停下来想知道我是否正确考虑这一点的地方。

  • 如果每次新运行计划都创建一个新表 - 这是 可扩展的(对我来说它是否可扩展并不重要,但它 显然对其他项目很重要)?
  • 在将数据输入到 MySQL的表,或者我可以连续进入然后进入下一个 项目是否正在排序?

最终,我不能只做一个循环,因为我需要添加其他因素,例如:

  • 该小组在过去 X 个预定周期内是否完成了此活动?如果是这样,请选择另一个。
  • 不要总是从活动列表的顶部开始,否则有些活动将始终排在日程表上,而有些活动将始终排在第一位,甚至可以根据某些因素确定重要性的优先级。
  • 最初我只是想安排团体日期的活动,但我还想添加一个功能,以便能够考虑另一个时间表(小木屋进行的独木舟旅行)以将它们从预定列表中排除在他们离开的日子里。

感谢我在排序逻辑方面获得的任何帮助。谢谢。

编辑: 因此,根据您的建议,我认为我有以下表格,其中只有两列 ID 和名称(用户可以随时更新/编辑):

cabins
activities

然后我添加另一个表,其中包含最多 56 列日期条目(8 周)+ 名称和用户列:

dates

然后我有另一个表叫:

schedule

其中有这样的列:

ID (primary Key)
User (logged in user that created this)
schedule_name (user defined name of schedule)
cabin (foreign key of a cabin)
period_001 (foreign key of first date in corresponding 'dates' table)
activity_001 (foreign key of an available activity which has been chosen to go here)
period_002 (...)
activity_003 (...)
etc...

然后 PHP 逻辑将要求按名称和用户分组的行,这样对于给定用户的每个时间表名称,营地中每个选定的小屋都会有一行(例如,25 间小屋有 25 行)。 “日期”表中的每一行都包含给定时间表的整个日期范围。

这是你的想法吗?

【问题讨论】:

  • 这可能更适合 programmers.stackexchange.com,因为它没有引用特定的可解决问题,因此不适合 Stackoverflow。
  • @Danack:不,实际上是这样。这不是一个概念性的编程问题,而是一个实际的问题。并非Stack Overflow 上的所有问题都需要代码。
  • 对我来说似乎是“我如何为我的数据建模”而不是“我如何编码”。但是不要关闭它,我正在起草一个答案......;)
  • 我认为两者兼而有之,TBH。如果我们更进一步,也许我可以用更多的代码示例重新散列。
  • @IMSoP:这不是“我如何为我的数据建模”,而是“当我有以下规则时,我该如何处理这些数据?”

标签: php mysql


【解决方案1】:

如果我理解正确,这是一个数据库建模问题。从您的具体问题开始:

是否应该每次新运行计划都创建一个新表?

没有。表代表事物的类型(就像 OO 实现中的类一样)。如果您需要区分该表中的行组,那么这是这些行的属性,并且可能本身就是一个单独的实体。因此,对于每个“新的计划运行”,您将有一个包含一行的表,然后使用外键在另一个表中引用它。

在将数据输入 MySQL 表之前,是否应该使用数组进行排序?

没有。输入到数据库表中的订单行不应该被用来赋予意义。如果他们有一些特定的订单,创建该订单的信息应该在表格的一列中。当您从数据库中检索数据时,您使用Order By 子句对数据进行排序。 (总是Selecting 数据时包含 Order By 子句。)

您的第二组要点似乎从如何建模数据跳转到如何查询数据。所以首先,请阅读:

  • 数据库规范化:简而言之,每个实体都应该有自己的表,它们之间的关系由外键定义
  • 实体-关系图:不必担心学习所有官方符号,但在 Visio 图表或纸上绘制数据确实有助于了解事物之间的关系

一旦您对实体是什么以及它们的规范化结构有了一个不错的了解,剩下的就应该是关于如何编写与它们相关的查询了:

  • “该组在过去 X 个计划周期内是否完成了此活动?”可能在groups 表、groups_scheduled_activities 数据透视表(即仅存在以多对多关系关联两个或多个表)和scheduled_periods 表之间存在JOIN。李>
  • “不要总是从活动列表的顶部开始......也许甚至能够优先考虑重要性”是关于当你在 UI 中显示 activities 表时如何选择它:也许Order By 子句涉及您的优先因素和随机因素。 (某些数据库中的随机排序可能很棘手,但环顾四周,您会发现很多解决方案。)
  • 如果我理解正确,“将他们从计划列表中排除在他们离开的日子里的因素考虑在内”将只是一种持续很长时间的特殊“活动”,并且可能在用户界面。从数据建模的角度来看,这只需要一个关于活动的属性(即activities 表上的一列)来将这些活动与“正常”活动区分开来。据推测,活动无论如何都会有一个“持续时间”属性。

【讨论】:

  • 好的,我进行了编辑以包含计划中的更改 - 这是您的想法吗?还有其他建议吗?
  • @red6 您编辑中的建议包括很多列,它们应该有行 - 您试图将多个内容压缩到一个表中。您还提到有一个表格来存储日期,这通常是不必要的,因为您可以只使用日期本身。我根据您目前提到的内容汇总了a quick example of a normalised schema
  • 我已经实施了您的大部分建议,今天正在努力完成它。您的最后一个要点是正确的,如果我将其视为“隐藏”活动或在其他地方呈现的活动,则可以以相同的方式存储。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2018-02-02
  • 2010-10-10
  • 1970-01-01
  • 2020-03-16
相关资源
最近更新 更多