Performance PostgreSQL-管理用户';s触点-单向或双向关系更好?

Performance PostgreSQL-管理用户';s触点-单向或双向关系更好?,performance,postgresql,jpa,eclipselink,user-management,Performance,Postgresql,Jpa,Eclipselink,User Management,我正在研究如何使用Vaadin+JPA+EclipseLink+PostreSQL开发一个用于共享图片的web应用程序,以及这种组合是否适合此目的。我正在为管理用户联系人的决定而挣扎。在解释表的结构后,我将进一步详细介绍这一点: 用户表 用户表由以下列组成: 用户ID-注册时自动生成(唯一) 用户名-用户的名称;注册时定义(唯一) 密码-用户的密码;注册时定义 上传-用户上传的图像的所有ID。我不会在这里详述,因为这与我的问题无关。只需说明,此列与另一个名为Images的表一起使用,用于管理当

我正在研究如何使用Vaadin+JPA+EclipseLink+PostreSQL开发一个用于共享图片的web应用程序,以及这种组合是否适合此目的。我正在为管理用户联系人的决定而挣扎。在解释表的结构后,我将进一步详细介绍这一点:

用户表

用户表由以下列组成:

  • 用户ID-注册时自动生成(唯一)
  • 用户名-用户的名称;注册时定义(唯一)
  • 密码-用户的密码;注册时定义
  • 上传-用户上传的图像的所有ID。我不会在这里详述,因为这与我的问题无关。只需说明,此列与另一个名为Images的表一起使用,用于管理当前用户的库
联系人表

此表纯粹用于存储用户之间的关系信息(我的一位同事决定这样做,坦率地说我不喜欢,但已经这样做了…)。它只有两列:

  • 用户ID-拥有联系人的用户ID(见下文)
  • 联系人-存储具有用户ID的用户授予查看其图像库权限的所有用户ID

    注意:这不是一种双向关系。这意味着,当用户X将用户Y添加到其联系人中时,用户X将访问其自己的图像库的权限授予用户Y。但是,这不会使用户Y的库对用户X可见。只有当用户Y也将用户X添加到其联系人中时,才会发生这种情况。图像可以是公共的,也可以是私有的。所有用户都可以查看公共图像,但只有拥有这些图像的用户以及所有者通过将其添加到联系人中而授予访问权限的所有其他用户才能查看私人图像。“私人”可能不是这里最好的术语,所以你可能会将其视为“允许朋友查看”之类的东西

无论何时删除用户,我都必须执行以下操作:

  • 删除用户上载的所有图像文件-图像表中的图像只有一个上载器。查看状态只需删除文件并从图像表中删除其条目是完全安全的,因为每个图像都绑定到其上载程序,而不绑定到任何其他文件(受影响:图像表,存储)
  • 删除用户的文件夹-遗憾的是,Java的工作方式是,在删除文件夹之前,必须先确保文件夹为空(受影响:存储)
  • 从所有用户的所有联系人列表中删除用户-这是我面临的主要困境(受影响:用户表)
  • 删除用户本人(受影响:用户表)
  • 由于到目前为止我写的查询,这个顺序基本上是应该的。考虑到我的表之间的关系,我发现它是最优的

    正如我在第3点中提到的,如何尽可能少地(从编码和性能角度)完成这项工作,我面临着两难的境地。我正在研究两种解决方案:

    • 单向关系-不要更改用户表,只需遍历其中的所有用户,然后遍历每个用户的联系人,查找我要删除的当前用户的用户ID

    • 双向关系-为用户添加一个名为addedBy的新列,该列存储已将我要删除的当前用户添加到其联系人中的用户的所有用户ID。每次用户X将另一个用户添加到他的联系人中时,该另一个用户将用户X“添加”到他的添加列表中,而不是联系人中

    我在单向关系中看到的问题恰恰是,我必须遍历所有用户,然后检查每个用户的联系人,看看它是否包含我要删除的用户ID

    我在双向关系中看到的问题是新列中增加的开销。然而,这里最大的好处是,我可以跳过查看所有用户的联系人(当然,这里最糟糕的情况是,当用户被添加到所有用户的联系人中时,omho不太可能发生;))并且只对那些被添加到列表中的用户执行此操作

    我远不是一个数据库专家,正如你可能已经注意到的那样,在上面的文章中,可能有一种更好的方法。然而,我只对上面提到的两个版本感兴趣,并且对DB的更改越少越好。我也不知道哪个查询更容易写。我已经完成了删除过程中的所有其他步骤(1、2和4),但第3步很难


    你知道哪一个更好吗?用户数量并不重要,因为这纯粹是为了研究而做的,但是用户表中的成百上千个条目应该会让事情变得更现实。

    我认为你的同事有某种正确的方法,但没有完全同意

    “联系人表”,这个表看起来像一个多对多关系表

    但问题正如你所描述的:

    Contacts-存储具有用户ID的用户提供的所有用户ID 允许查看他的图像库

    在真正的多对多关系表中,您将有两列

    • “用户id”,您已经拥有的内容

    • “contact_user_id”(命名可能明显不同),但主要的一点是您有一个sin
      delete from Contacts where contact_user_id = :userIdOfUserToBeDeleted