1

如果在其他时候有人问过或回答过这个问题,我深表歉意 - 我认为我的搜索一直在试图在服务器上安排 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 个小屋)。“日期”表中的每一行都包含给定时间表的整个日期范围。

这是你的想法吗?

4

1 回答 1

1

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

每次新的调度运行都应该创建一个新表吗?

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

在将数据输入 MySQL 表之前,我应该对数组进行排序吗?

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

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

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

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

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