performance - PostgreSQL-管理用户的联系人-单向或双向关系更好吗?

标签 performance postgresql jpa eclipselink user-management

我正在研究如何使用Vaadin+JPA+EclipseLink+PostreSQL开发一个用于共享图片的web应用程序,以及这种组合是否适合此目的。我正在为管理用户联系人的决定而挣扎。在解释表的结构之后,我将更详细地讨论这个问题:
用户表
users表由以下列组成:
用户ID-注册时自动生成(唯一)
用户名-用户的名称;注册时定义(唯一)
密码-用户的密码;注册时定义
上传-用户上传的所有图像的ID。我不想在这里详述,因为这与我的问题无关。可以说,此列与另一个名为Images的表一起用于管理当前用户的库
联系人表
这个表纯粹是用来存储用户之间的关系信息(我的一个同事决定这样做,坦白说我不喜欢,但已经这样做了…)。它只有两列:
用户ID-拥有联系人的用户ID(见下文)
联系人-存储具有用户ID的用户授予查看其图像库权限的所有用户ID。
注意:这不是双向关系。这意味着,当用户X将用户Y添加到其联系人中时,用户X将对其自己的图像库的访问权授予用户Y。但是,这不会使用户Y的库对用户X可见。只有当用户Y也将用户X添加到其联系人中时,才可能发生这种情况。图像可以是公共的也可以是私有的。所有用户都可以查看公共图像,但私人图像只能由拥有这些图像的用户以及所有者通过将其添加到联系人中而授予访问权限的所有其他用户查看。”“私人”在这里可能不是最好的说法,所以你可能会认为它是“允许朋友查看”之类的东西。
每当我删除用户时,我必须执行以下操作:
删除用户上载的所有图像文件-图像表中的图像只有一个上载程序。查看状态简单地删除文件并从image s表中删除它的条目是完全安全的,因为每个图像都绑定到它的上传程序和其他任何人(受影响的:Images表,存储)
删除用户的文件夹-不幸的是,Java的工作方式是,在删除文件夹之前,必须首先确保它是空的(受影响的:存储)
从所有用户的所有联系人列表中删除用户-这是我面临的主要困境(受影响:用户表)
删除用户本人(受影响:Users表)
因为到目前为止我所写的查询,这个顺序基本上就是它应该是怎样的。考虑到表之间的关系,我觉得这是最理想的。
正如我在第3点中所提到的,我在如何尽可能少地(从编码和性能角度)完成这项工作上遇到了两难的境地。我正在研究两种解决方案:
单向关系-不要更改Users表,只需遍历其中的所有用户,然后遍历每个用户的联系人,查找要删除的当前用户的用户ID
双向关系-向名为addedBy的用户添加一个新列,该列存储已将当前用户添加到其联系人中并要删除的用户的所有用户ID。每次用户X将另一个用户添加到其联系人中时,该另一个用户通过列表而不是联系人将用户X“添加”到其被添加列表中。
我在单向关系中看到的问题正是,我必须遍历所有用户,然后检查每个用户的联系人,看看它是否包含我要删除的用户ID。
我在双向关系中看到的问题是新列增加的开销。不过,这里最大的优点是,我可以跳过查看所有用户的联系人(当然,最坏的情况是,当用户被添加到所有用户的联系人中时,omho不太可能发生这种情况;)并且只对那些在被添加列表中的用户执行此操作。
我不是一个数据库专家,正如你可能已经注意到从上面写的可能有一个更好的方式做事情。不过,我只对上面提到的两个版本感兴趣,并且对数据库的更改越少越好。我也不知道哪个查询更容易写。我已经完成了删除过程中的所有其他步骤(1、2和4),但第3步是一个艰难的步骤。
你知道哪个更好吗?用户数量并不重要,因为这纯粹是为了研究而做的,但是用户表中的成百上千个条目应该会使事情更现实。

最佳答案

我认为你的同事有一种正确的方法,但并不完全赞同。
“联系人表”,这个表看起来像一个多对多关系表。
但问题是正如你所描述的:
Contacts-存储具有用户ID的用户所提供的所有用户ID
允许查看他的图像库。
在真正的多对多关系表中,有两列
“用户id”,您已经拥有的
“contact_user_id”(命名可能明显不同),但主要的一点是,对于每个联系人,此表中只有一行。
因此,当您删除一个用户并希望从所有联系人列表中删除该用户时,您可以简单地说:

delete from Contacts where contact_user_id = :userIdOfUserToBeDeleted

正如@Predrag Maric所描述的那样,通过引用完整性,您的数据库数据将更加健康,不仅在用户id上,而且在它链接的contact用户id上。
如果您使用JPA或类似的方法,这也会有帮助,例如,您可以使用JPA有一个删除策略,您可以将其设置为层叠来删除这些引用。但这只在完全标准化的表中得到支持。

关于performance - PostgreSQL-管理用户的联系人-单向或双向关系更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32885265/

相关文章:

python - python 中的 MySQL 查询需要很多时间,postgres 查询工作正常

spring - 使用 Spring 数据 JPA 获取随机记录

java - JPA/JPQL 返回不完整的结果 WHERE x.y IS NULL OR x.y.z = 1

ruby-on-rails - rake 数据库 :migrate not working on my postgres db

sql - 可以在没有子查询的情况下进行此查询吗?

postgresql - 为什么无法创建分区表

jpa - EJB3 实体类的单独 jar

performance - 与填充一起使用时 Mongoose 查询性能低下

c - OpenVMS定时器精度,优于毫秒精度。

c# - 在 C# 中的测试运行持续时间内排除测试初始化​​时间