队伍里的小伙子这样设计表,应该怎么评价

2021-08-27 11:33:07 +08:00
 5sheep

项目里有几个多对多关系,需要表达到关系数据库。

比如:用户 角色 权限; 用户与角色是多对多关系;角色与权限是多对多关系;

一般人会分别创建 [用户角色表]、[角色权限表],来存储多对多关系,这个没啥好说的。

现在队伍里一个小伙子嫌麻烦,就创建了一张 [数据关系表],大致字段有:[第一个 id],[第二个 id],[表名]。

大家分析下,这种做法,要如何评价

13990 次点击
所在节点    程序员
106 条回复
qping
2021-08-27 13:30:28 +08:00
貌似用着也没有什么问题,数据量一般也不会大

就是感觉怪怪的,能用但是不够漂亮。
young1lin
2021-08-27 13:33:38 +08:00
反范式设计,开发一时爽,维护火葬场。除非这个项目一定是他维护,不然让他改
young1lin
2021-08-27 13:36:56 +08:00
这个就是典型的 RBAC0 设计思路的表,你可以把更详细的 RBAC1, RBACA2, RBAC3 讲给他,还有 ACL,ABAC, PBAC 讲给他,让他去查。还有 Shiro/Spring Security 怎么实现的,最好是 Shiro 比较简单。再对比下他的设计,再让他说说你懂不懂。
EPr2hh6LADQWqRVH
2021-08-27 13:37:22 +08:00
你不了解,就别瞎说

邻接表,这是图查询的基石,只要数据库稍微支持一下图查询,这个结构能提供的比你那个捉鸡所谓关系模型多得多
soulzz
2021-08-27 13:40:57 +08:00
那还不如全用 mongodb 用户权限也和用户基本资料放一起,直接定义各个接口的权限
R18
2021-08-27 14:01:41 +08:00
你让他严格按照 BCNF 来就行了。
falcon05
2021-08-27 14:04:12 +08:00
楼主这表达能力让我想了半天,什么 id1,id2 的,说服力估计也不行❌
jtwor
2021-08-27 14:05:20 +08:00
数据库三范式。。。 那这样关联岂不是要带上 表名 条件。。
YUyu101
2021-08-27 14:07:47 +08:00
小伙子这样做就代表他把这些关系当成一个实体了,如果这些表的关系真的只有关系那没什么好说的,万一以后要给每种关系加各自属性,那他是准备搞父子表还是让多出来的字段空着,其实怎么设计都行,只要能评估好未来的工作量。
johnsonqrr
2021-08-27 14:21:25 +08:00
还能怎么办,上网发个贴呗
mosakashaka
2021-08-27 15:06:11 +08:00
索引搞好效率不会有问题。
Frauhling
2021-08-27 15:11:54 +08:00
@fgwmlhdkkkw 这个表名改为数字的主意听着就很好 XD 就是不知道是楼主先跑路还是这个小伙子先跑路
zxcslove
2021-08-27 15:15:37 +08:00
这样最大的问题是,不同的关联关系如果有不同的数据就悲剧了,只是做关联用你是杠不过他的。
5sheep
2021-08-27 15:19:26 +08:00
@rabbbit 是这样存的
真实建表语句如下:
CREATE TABLE [dbo].[DataConnect]( --数据关系表,可存一切多对多关系
[Id] [uniqueidentifier] NOT NULL,
[SourceCode] [nvarchar](100) NULL, --存表名
[FirstId] [uniqueidentifier] NULL, --第一个 id
[SecondId] [uniqueidentifier] NULL, --第二个 id
[ThirdId] [uniqueidentifier] NULL, --预留字段
... 其它预留字段
DavidDee
2021-08-27 15:27:37 +08:00
@5sheep FirstId 、SencodId 、ThirdId,我更疑惑了。?这些 id 存的是什么?
5sheep
2021-08-27 15:30:53 +08:00
@DavidDee 看 12 楼的例子
5sheep
2021-08-27 15:32:54 +08:00
12 楼的最后一行不准确,我修改下
@DavidDee

id1 | id2 | 表名
角色 id1| 权限 id1 | 用户权限表名
角色 id1| 权限 id2 | 用户权限表名
角色 id2| 权限 id1 | 用户权限表名
用户 id1| 角色 id1 | 用户角色表名
用户 id1| 角色 id2 | 用户角色表名
code4you
2021-08-27 15:35:02 +08:00
只要小伙子 能搞定 能跑就行
baoshijiagong
2021-08-27 15:38:11 +08:00
sql 里面,表名如果写错,不会报错,还会以为没有数据。不好排查原因。
DavidDee
2021-08-27 15:42:53 +08:00
@5sheep
所以就是他将本来该分为两个多对多的关系表,直接使用了一个表设计,所以 id1,id2 是字段是无法确定存放的是什么内容。
如果表名 == 用户角色表名,那么 id1 就是用户 id,id2 就是角色 id ;
如果表名 == 用户权限表名,那么 id1 就是角色 id,id2 就是权限 id 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/798305

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX