上下游依赖 这种er关系 在mysql 等关系型数据库中 如何设计 存储
2014-08-22 14:38
2236 查看
问题场景: 在任务调度系统中,每个任务 既有上游 ,也有下游。如何设计 底层存储的表结构 支撑这种存储。
解决方法:
一. 采用图形 数据库 neo4j,每个节点 代表一个任务,节点之间的 边 (带有方向箭头) 表示 任务之间的依赖关系。
二. mysql等关系型数据库。
设计1 : 将 上下游依赖关系 作为 任务的属性 存储起来。 即: 任务id(主键)、任务名称、任务的上游id list、任务的下游id list。
优点: 这是最容易想到的方案。 但知觉告诉我不是很佳的方案,而且也显然不满足 3NF的设计原理。
缺点:
设计2: 只存储任务的上游依赖。 即 任务id(主键)、任务名称、任务的上游id list。
设计3: 将 任务之间的 依赖关系 单独 作为一个记录表 保存。依赖关系记录表的 表结构:自增主键id、上游任务id、下游任务id。同时 将 第二列、第三列都增加索引。
推荐设 计3.
优点: 因为依赖关系是 相对的,如果A和B有依赖关系,显然上游任务id就是A,下游任务id就是B。作为一条记录 insert 记录表。
如何查询 A的所有下游,则 select 下游任务id from 表 where 上游任务id=‘A’。 如果记录条数为0,则说明A无下游。
如何查询A的所有上游, 则 select 上游任务id from 表 where 下游任务id=‘A’。
而且不存在冗余。 对于任何一个依赖关系,只有一条记录。
解决方法:
一. 采用图形 数据库 neo4j,每个节点 代表一个任务,节点之间的 边 (带有方向箭头) 表示 任务之间的依赖关系。
二. mysql等关系型数据库。
设计1 : 将 上下游依赖关系 作为 任务的属性 存储起来。 即: 任务id(主键)、任务名称、任务的上游id list、任务的下游id list。
优点: 这是最容易想到的方案。 但知觉告诉我不是很佳的方案,而且也显然不满足 3NF的设计原理。
缺点:
设计2: 只存储任务的上游依赖。 即 任务id(主键)、任务名称、任务的上游id list。
设计3: 将 任务之间的 依赖关系 单独 作为一个记录表 保存。依赖关系记录表的 表结构:自增主键id、上游任务id、下游任务id。同时 将 第二列、第三列都增加索引。
推荐设 计3.
优点: 因为依赖关系是 相对的,如果A和B有依赖关系,显然上游任务id就是A,下游任务id就是B。作为一条记录 insert 记录表。
如何查询 A的所有下游,则 select 下游任务id from 表 where 上游任务id=‘A’。 如果记录条数为0,则说明A无下游。
如何查询A的所有上游, 则 select 上游任务id from 表 where 下游任务id=‘A’。
而且不存在冗余。 对于任何一个依赖关系,只有一条记录。
相关文章推荐
- [ZT]如何使用Erwin进行基于MYSQL的数据库设计
- 如何使用ERwin进行基于Mysql的数据库设计
- 如何使用mysql存储树形关系
- [MySQL] 关系型数据库的设计范式 1NF 2NF 3NF BCNF
- 数据库设计之概念模型ER关系图
- 希望大牛讨论 树状数据如何选择数据库和设计存储格式
- 在python的应用程序中,不需要关系型数据库时,如MySQL可以使用python提供的持久字典dbm来存储名称和值(键值对)
- 如何使用mysql存储树形关系
- 数据库设计问题1-之富文本内容存储到mysql后的读取问题
- 如何设计高效合理的MySQL查询语句(建立数据库索引的基本原则)
- 文档型数据库设计模式-如何存储树形数据
- 数据库--ER模型、函数依赖、无损分解、关系代数
- 学习mysql(2)-如何设计数据库(一)
- 论如何设计关系数据库结构
- 如何更改在Ubuntu下的MySQL的默认数据库存储位置
- 数据库--ER模型、函数依赖、无损分解、关系代数
- 文档型数据库设计模式-如何存储树形数据
- 【数据库设计-1】如何创建1对多、多对多的关系表
- [ mongoDB ] - 文档型数据库设计模式-如何存储树形数据
- 类的继承关系如何在关系型数据库体现