database-design - 设计具有复杂依赖关系的数据库?(与调度有关)
问题描述
我正在寻求设计一个数据库来存储有关一些复杂依赖项的信息,并且可以真正使用正确的方向。我的谷歌搜索没有发现任何相关信息,但也许你有一个很棒的网络链接。
为了提供上下文,它围绕作业调度并将提供分析。不,我不想创建作业调度程序。
关于数据的一些说明
- 数据可以是递归的。作业 C 依赖于作业 B,而作业 B 又依赖于作业 A
- 可能存在一对多的依赖关系:作业 C 可能依赖于作业 B1 和作业 B2
- 可能存在复杂的依赖关系:作业 C 可能依赖于(作业 B1 或作业 B2)和作业 A
- 可能有一个混淆变量...时间:工作 A 或上午 10 点
解决方案
这是其中一种方法:
CREATE TABLE job (
id integer NOT NULL,
title character varying NOT NULL,
CONSTRAINT pk_job
PRIMARY KEY (id)
);
-- simple job-job dependency, time-based dependency, complex job-job-dependency construct
CREATE TABLE dependency_type (
id integer NOT NULL,
title character varying NOT NULL,
CONSTRAINT pk_dependency_type
PRIMARY KEY (id)
);
COMMENT ON TABLE dependency_type IS 'simple job-job dependency, time-based dependency, complex job-job-dependency construct';
-- AND, OR, XOR
CREATE TABLE operator_type (
id integer NOT NULL,
title character varying NOT NULL,
CONSTRAINT pk_operator_type
PRIMARY KEY (id)
);
COMMENT ON TABLE operator_type IS 'AND, OR, XOR';
CREATE TABLE dependency (
id integer NOT NULL,
type_id integer NOT NULL,
job_id integer,
depend_on_job_id integer,
depend_on_dependency_id integer,
operator_type_id integer,
condition varchar,
CONSTRAINT pk_dependency
PRIMARY KEY (id)
);
ALTER TABLE dependency
ADD CONSTRAINT fk_dependency_depend_on_dependency_id
FOREIGN KEY (depend_on_dependency_id)
REFERENCES dependency (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE dependency
ADD CONSTRAINT fk_dependency_depend_on_job_id
FOREIGN KEY (depend_on_job_id)
REFERENCES job (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE dependency
ADD CONSTRAINT fk_dependency_job_id
FOREIGN KEY (job_id)
REFERENCES job (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE;
ALTER TABLE dependency
ADD CONSTRAINT fk_dependency_operator_type_id
FOREIGN KEY (operator_type_id)
REFERENCES poperator_type (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE RESTRICT;
ALTER TABLE dependency
ADD CONSTRAINT fk_dependency_type_id
FOREIGN KEY (type_id)
REFERENCES dependency_type (id) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE;
因此,对于您描述的情况:
否 1.作业 C 依赖于作业 B,而作业 B 又依赖于作业 A
INSERT INTO dependency (type_id, job_id, depend_on_job_id) VALUES (SIMPLE, JOB B, JOB A);
INSERT INTO dependency (type_id, job_id, depend_on_job_id) VALUES (SIMPLE, JOB C, JOB B);
否 2.作业 C 可能依赖于作业 B1 和作业 B2
INSERT INTO dependency (type_id, depend_on_job_id) VALUES (SIMPLE, JOB B2);
INSERT INTO dependency (type_id, job_id, depend_on_job_id, depend_on_dependency_id, operator_type_id) VALUES (COMPLEX, JOB C, JOB B1, DEPENDENCY D1 (from previous insert), AND);
否 3.工作 C 可能依赖于(工作 B1 或工作 B2)和工作 A
INSERT INTO dependency (type_id, depend_on_job_id) VALUES (SIMPLE, JOB B2);
INSERT INTO dependency (type_id, depend_on_job_id, depend_on_dependency_id, operator_type_id) VALUES (COMPLEX, JOB B1, DEPENDENCY D1 (from previous insert), OR);
INSERT INTO dependency (type_id, job_id, depend_on_job_id, depend_on_dependency_id, operator_type_id) VALUES (COMPLEX, JOB C, JOB A, DEPENDENCY D2 (from previous insert), AND);
否 4.工作 C 可能依赖于工作 A 或上午 10 点
INSERT INTO dependency (type_id, condition) VALUES (TIME-BASED, '10 AM');
INSERT INTO dependency (type_id, job_id, depend_on_job_id, depend_on_dependency_id, operator_type_id) VALUES (COMPLEX, JOB C, JOB A, DEPENDENCY D1 (from previous insert), OR);
此模型可能有更新:您可能希望拆分depend_on_job_id
为depend_on_dependency_id
多个列(depend_on_job1_id
、depend_on_job2_id
等)。在某些情况下,这会减少树的深度(例如第 2种情况。然后可以只用一个来实现INSERT
)。当然,模型会跳过索引、唯一键等。
此外,用 SQL 阅读这棵树是完全不同的故事。
推荐阅读
- python - scrapy 从 txt 文件读取 url 失败
- json - 如何为 to_jsonb postgres 函数将 postgres SQL 转换为 SQLite?
- sql - SQL 优化:超出 CPU 使用的调用限制
- javascript - 防止基本表单的默认js
- vue.js - 我想了解vue异步更新
- python - 在 " 上调用函数
" 在调用 enter 函数时,帧上会导致帧闪烁 - mysql - 使用查询的别名与另一个表 MySQL 连接
- windows - 如何从 Windows 命令文件中获取最后一个默认网关
- javascript - 在特定位置将元素插入 DOM 不起作用
- c++ - 我如何在一个 if 语句中声明所有数字