上下级数据权限该怎么设计讨论

qiushangju 2018-08-26 01:33:50
比如会员系统,推荐人和被推荐人。
比如 A->B->C->D .....
A推荐B,B推荐C,C推荐D....
要求A登录能看到A、B、C、D的所有记录。
B登录能看到 B、C、D
C登录能看到C、D
A同时能推荐 B1、B2、B3
该怎么设计
id name parentId IdPath
1 A 0 |1|
2 B 1 |1|2|
3 C 2 |1|2|3|
4 D 3 |1|2|3|4|
如这样设计 那么所有表查询都需要加子查询,始终感觉不对劲
如查询b下订单(select * from Order where UserId in (select Id from User where IdPath like '%|2|%'))

...全文
615 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
既然有全路径字段 IdPath 左匹配不就好了
select O.*
from Order O
join [User] U
on U.IdPath like '|1|2|%'
and O.UserId =U.Id
hgwyl 2018-12-09
  • 打赏
  • 举报
回复
如果“级别”是固定的话,改个设计思路。

A1推荐B1、C1、D1、E1
——A1+(B1、C1、D1、E1)都属于A1班
——字段中要有“所属班级”

B1推荐C21、C22、C23
——B1+(C21、C22、C23)都属于B1组
——因为B1属于A1班,所有B1组全部属于A1班
——字段中要有“所属组别”

C21推荐D301、D302、D303
——C21+(D301、D302、D303)都属于C21桌
——因为C21属于B1组,所有C21桌全部属于B1组
——所有B1组全部属于A1班
——字段中要有“所属桌子”
qq_30431673 2018-08-28
  • 打赏
  • 举报
回复
你这应该是要两个表吧,一个 a b c 对应的ID 表 ,一个推荐表。
id name
1 A
2 b
3 c
IDmst iddtl

1 2
1 3
2 3
吉普赛的歌 2018-08-27
  • 打赏
  • 举报
回复
那 hierarchyid 就是专门为你准备的:
https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/bb677173(v%3dsql.100)

只要你的 SQL Server 版本在 2008 或以上就能用了。
zjcxc 2018-08-27
  • 打赏
  • 举报
回复
通常就设计成 id + parentid, 如果经常做上下经查询,那么再扩展一张表 id, childid, 这个表对于每个 id, 它的每个 child 放一行,这样可以直接 join
qiushangju 2018-08-27
  • 打赏
  • 举报
回复
因为 我担心数据量太大 性能会有问题
qiushangju 2018-08-27
  • 打赏
  • 举报
回复
额 楼有点偏了 我是想问有没有更好的设计,更高效,不是现有结构怎么查询
二月十六 2018-08-26
  • 打赏
  • 举报
回复
IdPath这列不用加,用递归循环的方式查询所有的子集,比如说查B:

--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[name] nvarchar(21),[parentId] int)
Insert #T
select 1,N'A',0 union all
select 2,N'B',1 union all
select 3,N'C',2 union all
select 4,N'D',3
Go
--测试数据结束
;WITH cte AS(
Select * from #T WHERE name='B' --这里的B,根据需要传不同的值
UNION ALL
SELECT #T.* FROM #T JOIN cte ON #T.parentId=cte.id
)
SELECT * FROM cte


卖水果的net 2018-08-26
  • 打赏
  • 举报
回复
使用 CTE 不更好吗 ?
qiushangju 2018-08-26
  • 打赏
  • 举报
回复
是放假没人么

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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