数据库表设计的问题,帮帮忙

叶恭介叶恭介 2018-06-11 10:26:35
有个需求大概是这样的:

A1管理B1,B1管理C1
G1管理D1D2,D2管理F1

这样的层级管理,不限层数,设置谁可以管理谁,那这个表要怎么设置,还有要怎么用SQL求这个人可以管理的所有人(像上面的A1可以管理B1和C1,G1可以管理D1和D2和F1).

我的想法设计是这样的,就3个字段

自增ID 管理人ID 被管理人ID

但SQL就不知道怎么写了

...全文
908 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
szl.dev 2018-06-25
  • 打赏
  • 举报
回复
引用 11 楼 cvbtvbwu 的回复:
[quote=引用 10 楼 worldy 的回复:]
A1管理B1,B1管理C1
G1管理D1D2,D2管理F1

建议一种方法:
设计一个规则化的编码ID,编码位数确定,下级的位数比上级长

比如:A1 编码A1
B1 编码A1B1
C1 编码 A1B1C1

数据库查询:
select * from aTable where 编码 LIKE ‘A1*’ //假设*是通配符,这样你就可以找出和A1关联的所有下级


这个也不行啊,因为C1可能给A1和A2管理。
向立天 2018-06-16
  • 打赏
  • 举报
回复
引用 18 楼 cvbtvbwu 的回复:
[quote=引用 16 楼 xianglitian 的回复:] 首先要确定一个人可能的下线是不是有限个 如果是的话可以空出字段保存下线 如果不是的话就把下线用字符串的方式把存在一个字段下吧 然后通过sql分析字符串来统计
是无限个,字符串的话,当我要找某个人的所有下属管理人需要全表把每个人的关系字符串取出来,不好。[/quote]sql语句可以用正则的
worldy 2018-06-15
  • 打赏
  • 举报
回复
引用 20 楼 cvbtvbwu 的回复:
[quote=引用 19 楼 worldy 的回复:] 我也是醉了,空间和时间你自己去平衡吧
你的想法不太好啊,如果我增加一个手下,那我的上头也要增加一条数据,上头的上头也要增加一条数据.....多恐怖。[/quote] 你都没有理解我的说法: A1 编码A1 B1 编码A1B1 C1 编码 B1C1 A2 编码A2 B1 编码A2B1 C1 编码 A2B1C1 现在,你 在B1增加一个手下X1,X1的直接关系是B1,那么,你只要增加 X1 编码 A2B1X1 //A2B1是B1 的编码,直接使用,跟上级的上级没有关系,不是你说的上头也要增加数据 有新的直接的关系才需要增加,其他情况都不需要增加
赵4老师 2018-06-15
  • 打赏
  • 举报
回复
这个问题的本质就是“有向无环图的存储”,个人意见。
worldy 2018-06-14
  • 打赏
  • 举报
回复
引用 14 楼 cvbtvbwu 的回复:
[quote=引用 13 楼 worldy 的回复:] [quote=引用 11 楼 cvbtvbwu 的回复:] [quote=引用 10 楼 worldy 的回复:] A1管理B1,B1管理C1 G1管理D1D2,D2管理F1 建议一种方法: 设计一个规则化的编码ID,编码位数确定,下级的位数比上级长 比如:A1 编码A1 B1 编码A1B1 C1 编码 A1B1C1 数据库查询: select * from aTable where 编码 LIKE ‘A1*’ //假设*是通配符,这样你就可以找出和A1关联的所有下级
这个也不行啊,因为C1可能给A1和A2管理。[/quote] C1要分身受多个人管理,这个是属于多对多的关系。你应该将C1数据扩展为两条 首先:A1-B1-C1 A1 编码A1 B1 编码A1B1 C1 编码 A1B1C1 同时 A2-C1: A2 码 A2 C1 码 A2C1 (C1存在两条数据) 你的目标是:"还有要怎么用SQL求这个人可以管理的所有人" 通过 select * from aTable where 编码 LIKE ‘A1*’ ,你获得了A1管理的所有人 select * from aTable where 编码 LIKE ‘A2*’ ,你 也获得了A2管理所有人 概念也是清楚的,因为既然C1所多人管理,自然需要有和多人关联的信息[/quote] A1 编码A1 B 编码A1B C1 编码 BC1 A2 编码A2 B 编码A2B C1 编码 BC1 问题像上面一样,A1可以管理B和C1,A2可以管理B和C1,管理层次A管理B也可以管理B管理下的人。像你写的,这样保存 A1 编码A1 B1 编码A1B1 C1 编码 B1C1 A2 编码A2 B1 编码A2B1 C1 编码 A2B1C1 这样保存太多了重复关系了 [/quote] A1-C1 关系 A2-C1关系 按照你的说法,这些关系,自然需要保存的 至于C1本身的独立的其他信息,你可以使用独立表保存,使用查询获取C1 的信息,保存的也仅仅是关系信息,你使用别的方式可以节省空间?
叶恭介叶恭介 2018-06-14
  • 打赏
  • 举报
回复
引用 13 楼 worldy 的回复:
[quote=引用 11 楼 cvbtvbwu 的回复:] [quote=引用 10 楼 worldy 的回复:] A1管理B1,B1管理C1 G1管理D1D2,D2管理F1 建议一种方法: 设计一个规则化的编码ID,编码位数确定,下级的位数比上级长 比如:A1 编码A1 B1 编码A1B1 C1 编码 A1B1C1 数据库查询: select * from aTable where 编码 LIKE ‘A1*’ //假设*是通配符,这样你就可以找出和A1关联的所有下级
这个也不行啊,因为C1可能给A1和A2管理。[/quote] C1要分身受多个人管理,这个是属于多对多的关系。你应该将C1数据扩展为两条 首先:A1-B1-C1 A1 编码A1 B1 编码A1B1 C1 编码 A1B1C1 同时 A2-C1: A2 码 A2 C1 码 A2C1 (C1存在两条数据) 你的目标是:"还有要怎么用SQL求这个人可以管理的所有人" 通过 select * from aTable where 编码 LIKE ‘A1*’ ,你获得了A1管理的所有人 select * from aTable where 编码 LIKE ‘A2*’ ,你 也获得了A2管理所有人 概念也是清楚的,因为既然C1所多人管理,自然需要有和多人关联的信息[/quote] A1 编码A1 B 编码A1B C1 编码 BC1 A2 编码A2 B 编码A2B C1 编码 BC1 问题像上面一样,A1可以管理B和C1,A2可以管理B和C1,管理层次A管理B也可以管理B管理下的人。像你写的,这样保存 A1 编码A1 B1 编码A1B1 C1 编码 B1C1 A2 编码A2 B1 编码A2B1 C1 编码 A2B1C1 这样保存太多了重复关系了
叶恭介叶恭介 2018-06-14
  • 打赏
  • 举报
回复
引用 19 楼 worldy 的回复:
我也是醉了,空间和时间你自己去平衡吧
你的想法不太好啊,如果我增加一个手下,那我的上头也要增加一条数据,上头的上头也要增加一条数据.....多恐怖。
worldy 2018-06-14
  • 打赏
  • 举报
回复
我也是醉了,空间和时间你自己去平衡吧
叶恭介叶恭介 2018-06-14
  • 打赏
  • 举报
回复
引用 16 楼 xianglitian 的回复:
首先要确定一个人可能的下线是不是有限个 如果是的话可以空出字段保存下线 如果不是的话就把下线用字符串的方式把存在一个字段下吧 然后通过sql分析字符串来统计
是无限个,字符串的话,当我要找某个人的所有下属管理人需要全表把每个人的关系字符串取出来,不好。
叶恭介叶恭介 2018-06-14
  • 打赏
  • 举报
回复
引用 15 楼 worldy 的回复:
[quote=引用 14 楼 cvbtvbwu 的回复:] [quote=引用 13 楼 worldy 的回复:] [quote=引用 11 楼 cvbtvbwu 的回复:] [quote=引用 10 楼 worldy 的回复:] A1管理B1,B1管理C1 G1管理D1D2,D2管理F1 建议一种方法: 设计一个规则化的编码ID,编码位数确定,下级的位数比上级长 比如:A1 编码A1 B1 编码A1B1 C1 编码 A1B1C1 数据库查询: select * from aTable where 编码 LIKE ‘A1*’ //假设*是通配符,这样你就可以找出和A1关联的所有下级
这个也不行啊,因为C1可能给A1和A2管理。[/quote] C1要分身受多个人管理,这个是属于多对多的关系。你应该将C1数据扩展为两条 首先:A1-B1-C1 A1 编码A1 B1 编码A1B1 C1 编码 A1B1C1 同时 A2-C1: A2 码 A2 C1 码 A2C1 (C1存在两条数据) 你的目标是:"还有要怎么用SQL求这个人可以管理的所有人" 通过 select * from aTable where 编码 LIKE ‘A1*’ ,你获得了A1管理的所有人 select * from aTable where 编码 LIKE ‘A2*’ ,你 也获得了A2管理所有人 概念也是清楚的,因为既然C1所多人管理,自然需要有和多人关联的信息[/quote] A1 编码A1 B 编码A1B C1 编码 BC1 A2 编码A2 B 编码A2B C1 编码 BC1 问题像上面一样,A1可以管理B和C1,A2可以管理B和C1,管理层次A管理B也可以管理B管理下的人。像你写的,这样保存 A1 编码A1 B1 编码A1B1 C1 编码 B1C1 A2 编码A2 B1 编码A2B1 C1 编码 A2B1C1 这样保存太多了重复关系了 [/quote] A1-C1 关系 A2-C1关系 按照你的说法,这些关系,自然需要保存的 至于C1本身的独立的其他信息,你可以使用独立表保存,使用查询获取C1 的信息,保存的也仅仅是关系信息,你使用别的方式可以节省空间? [/quote] A1 编码A1 B 编码A1B C1 编码 BC1 A2 编码A2 B 编码A2B C1 编码 BC1 当我增加B的管理人员如C2,只需要添加一个 C2 编码BC2。但以你的 A1 编码A1 B1 编码A1B1 C1 编码 B1C1 A2 编码A2 B1 编码A2B1 C1 编码 A2B1C1 需要增加两个 C2 编码 A1B1C2 C2 编码 A2B1C2
向立天 2018-06-14
  • 打赏
  • 举报
回复
首先要确定一个人可能的下线是不是有限个 如果是的话可以空出字段保存下线 如果不是的话就把下线用字符串的方式把存在一个字段下吧 然后通过sql分析字符串来统计
赵4老师 2018-06-13
  • 打赏
  • 举报
回复
百度搜“有向无环图的存储”
叶恭介叶恭介 2018-06-13
  • 打赏
  • 举报
回复
引用 10 楼 worldy 的回复:
A1管理B1,B1管理C1 G1管理D1D2,D2管理F1 建议一种方法: 设计一个规则化的编码ID,编码位数确定,下级的位数比上级长 比如:A1 编码A1 B1 编码A1B1 C1 编码 A1B1C1 数据库查询: select * from aTable where 编码 LIKE ‘A1*’ //假设*是通配符,这样你就可以找出和A1关联的所有下级
这个也不行啊,因为C1可能给A1和A2管理。
worldy 2018-06-13
  • 打赏
  • 举报
回复
引用 11 楼 cvbtvbwu 的回复:
[quote=引用 10 楼 worldy 的回复:] A1管理B1,B1管理C1 G1管理D1D2,D2管理F1 建议一种方法: 设计一个规则化的编码ID,编码位数确定,下级的位数比上级长 比如:A1 编码A1 B1 编码A1B1 C1 编码 A1B1C1 数据库查询: select * from aTable where 编码 LIKE ‘A1*’ //假设*是通配符,这样你就可以找出和A1关联的所有下级
这个也不行啊,因为C1可能给A1和A2管理。[/quote] C1要分身受多个人管理,这个是属于多对多的关系。你应该将C1数据扩展为两条 首先:A1-B1-C1 A1 编码A1 B1 编码A1B1 C1 编码 A1B1C1 同时 A2-C1: A2 码 A2 C1 码 A2C1 (C1存在两条数据) 你的目标是:"还有要怎么用SQL求这个人可以管理的所有人" 通过 select * from aTable where 编码 LIKE ‘A1*’ ,你获得了A1管理的所有人 select * from aTable where 编码 LIKE ‘A2*’ ,你 也获得了A2管理所有人 概念也是清楚的,因为既然C1所多人管理,自然需要有和多人关联的信息
worldy 2018-06-12
  • 打赏
  • 举报
回复
A1管理B1,B1管理C1 G1管理D1D2,D2管理F1 建议一种方法: 设计一个规则化的编码ID,编码位数确定,下级的位数比上级长 比如:A1 编码A1 B1 编码A1B1 C1 编码 A1B1C1 数据库查询: select * from aTable where 编码 LIKE ‘A1*’ //假设*是通配符,这样你就可以找出和A1关联的所有下级
向立天 2018-06-12
  • 打赏
  • 举报
回复
可以考虑设置一个权限表,每个人有一个权限 通过sql语句比较权限就可以知道所有底权限的人归高权限的人管理 如果不同管理链条相互独立可以考虑分权限种类
boylafong 2018-06-12
  • 打赏
  • 举报
回复
A1跟B1中间建立一个关系表,所有数据管理通过关系表来处理 表A1字段 ID 管理人员姓名 职位 等等 关系表字段 ID A1表ID B1表ID 表B1字段 ID 被管理人员姓名 职位 等等
ckc 2018-06-12
  • 打赏
  • 举报
回复
这个表结构是可以的,至于sql,你可以写存储过程什么的来获取,或者在应用里遍历吧
叶恭介叶恭介 2018-06-12
  • 打赏
  • 举报
回复
引用 8 楼 boylafong 的回复:
[quote=引用 7 楼 boylafong 的回复:] select * from B1 where id in( select A1id from 关系表 where A1ID in(select id from A1 where 管理者=‘需要查询的管理者姓名’) )
你可以写成一个存储过程,一些会改动的数据当成参数就可以了[/quote] 你这个只能查一层的管理关系,不能多层管理关系A1可以管理B1,也可以管理(B1管理下的C1)
boylafong 2018-06-12
  • 打赏
  • 举报
回复
引用 7 楼 boylafong 的回复:
select * from B1 where id in( select A1id from 关系表 where A1ID in(select id from A1 where 管理者=‘需要查询的管理者姓名’) )
你可以写成一个存储过程,一些会改动的数据当成参数就可以了
加载更多回复(3)

4,018

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧