【发布时间】:2022-01-19 14:00:19
【问题描述】:
为了简化描述,假设我们有一个带有 TimeScopes(ID、start、end)的 DB 模型和带有 FK(TimeScopes.ID)的进程,这是一对多的关系,所有进程都持有一个引用到 TimeScopes.ID 在给定的时间范围内运行。
首先,您定义一个时间范围并选择在该时间范围内运行的多个进程。
TimeScopes
|__
Processes
应用程序中有一些额外的限制(目前数据库中没有数据库触发器),例如假设 TimeScope 不重叠 - 当时只有一个 TimeScope 可能处于活动状态。
现在我有一个新的要求,即添加一些可以在任何时候不受任何限制地启动的新进程 - 所以实际上它们不必这样做,但它们可以同时运行(并行)。
在这种情况下,有人会先定义流程,然后将其分配给这样一个新的、单一的流程多个时间范围,没有前面提到的约束。所以这将是一个进程与许多 TimeScopes 的完全相反的关系。
Processes
|__
TimeScopes
我正在寻求有关如何解决问题的帮助和建议?
从关系的角度来看,我可以通过添加一个表来定义两个方向的关系,将 TimeScopes 和 Processes 之间的关系调整为多对多。
TimeScopes
|__
__ TP-Relations
|
Processes
让我不确定的是现有模型的额外时间限制。这促使我考虑另一种解决方案,并为 NewProcesses 和 NewTimeScopes 定义一个单独的表
NewProcesses
|__
NewTimeScopes
随后使用 UNION 语句在查询中合并两个模型之间的结果。
哪个更好?还有其他或更好的想法吗?
更新/改写问题
假设我们通过附加的“AB”(联结)表建立了多对多关系中的实体“A”和“B”。
对于一些以一对多关系表示 A->B 的记录,关于 A 记录还有一些额外的限制。假设我们有一些触发器来观察 A 中的每条记录不会跨越另一个 A 记录的边界。
对于以一对多关系表示 B->A 的其他记录,这些边界并不总是可接受的,因此不应强制/检查。
问题:如何处理这样的问题?
- 修改模型/关系,如何?
- 修改触发器?但是在数据库级别上是否甚至可以识别为 A->B 与 B->A 关系输入一些记录?
【问题讨论】:
-
我正在阅读您的信息,我无法确定流程和时间范围之间的关系。我曾经使用过的每个作业调度系统都只处理进程。
-
@GilbertLeBlanc 我不确定在不参考时间范围的情况下如何安排任何事情? Cronjobs 怎么样?您定义时间范围(不是根据开始和结束,而是根据频率)以及要执行的脚本,对吗? Cron 不会检查是否有任何其他作业同时运行,因此即使我在更一般/抽象的上下文中使用它,这也可以说明我的 NewProcess 要求。
-
进程一触发进程二。进程三必须等待进程一完成才能开始。进程四是独立的,可以随时启动。时间参考在哪里?我熟悉的唯一时间参考是批处理作业窗口从下午 6 点开始,那时每个人都回家休息。
-
您能列出属于“实体”的表吗?然后注意 1:many "relationships" 需要一个表中的 id 才能链接到另一个表。 Many:many 关系之间需要一个联结表。
-
我不确定我是否理解。以下是真的吗? - 一个时间范围可以有多个进程 - 一个进程可以属于多个时间范围 - 一个时间范围不应与另一个时间范围有重叠的开始或结束
标签: mysql database-design