【问题标题】:FOSUserBundle: Doubts about DB designFOSUserBundle:对数据库设计的质疑
【发布时间】:2025-12-09 22:05:01
【问题描述】:

我正在使用 FOSUserBundle 在 Symfony2 中进行开发,但我不太确定 DDBB 设计。我会尽量简单地解释我的情况。 假设我的项目就像 facebook。所以你知道实体“用户”将是整个应用程序中最重要和最相关的,一切都与它相关。

关键是我不确定如何使用 FOSUserBundle 处理 DB 层(表、学说实体和关系)。默认情况下,实体 User 必须具有所有 FOSUserBundle 字段(用户名、电子邮件、令牌、email_canonical 等等......)。 所以我怀疑我是否应该创建另一个实体来处理与其他实体的关系,比如“UserReal”。它将与第一个实体“用户”具有 OneToOne 关系,女巫将仅用于登录或访问目的。或者只创建一个对象“用户”并用它处理所有事情。

我的选择:

1。 - 实体“UserSecurity”女巫扩展了 FosUserBundle 用户实体,并且仅限用于访问(登录、注销、注册)情况。 - 有实体“UserReal”,或者只是“用户”女巫拥有来自用户的每个字段属性(姓名、姓氏、位置)。它与其他实体(如页面、组、照片)有关系。它是“主要”实体,具有生成值的策略。 - UserSecurity 通过 UserSecurity->id_user 与用户建立 OneToOne 关系。 - 注册必须插入两个实体。

  1. 反过来

    • 与第 1 点类似,但主要实体是“UserSecurity”,因此 id 将在其中,生成值的策略也将在其中。
    • 用户实体,将具有字段 id_user 与 OneToOne 到 UserSecurity 的关系。
  2. 使用一个对象

    • 在一个实体中扩展 FOSUserBundle 并设置与其相关的所有关系。
    • 我不喜欢这样,因为我需要一个没有安全选项的干净对象用户。

我认为 facebook 有很多 User 实体实例(例如,每个朋友一个),但只有一个用户登录实例,所以如果我们将它用于所有内容将是错误的。

我想知道其他意见/建议。

我希望它没有混淆(或者我没有混淆)。

非常感谢。

【问题讨论】:

    标签: symfony doctrine-orm fosuserbundle


    【解决方案1】:

    只需扩展 FOS 用户类,无需与孪生实体建立OneToOne 关系。

    拆分更多实体会导致水合和持久性开销,但还会导致不需要的分离逻辑:您正在定义用户属性 [用户名、密码、名字、姓氏等],它们都属于同一实体。

    如果您需要不同类型的用户,您应该考虑与其他实体组成子类,但这超出了您的问题范围。

    【讨论】:

    • 谢谢@moonwave99,我理解,但我的意思是我将在所有实体中继承从 FOS 用户类的所有实体属性。这听起来很奇怪,因为使用 facebook 示例,“朋友”将是一个用户实体,但它不必具有 fos 用户类属性(如密码)。
    • 您的 Facebook 好友的帐户中没有密码吗? :)) 例如,当您序列化实体时,只需隐藏一些属性,但是用任何东西制作 OneToOne 对您没有多大帮助。