【问题标题】:Should a user's profile be a separate model?用户的个人资料应该是一个单独的模型吗?
【发布时间】:2010-12-14 20:05:49
【问题描述】:

我通过构建一个简单的网站来学习 Rails,用户可以在其中创建文章并评论这些文章。我有一个列出用户最近的文章和 cmets 的视图。现在我想添加用户“个人资料”,用户可以在其中输入他们的位置、年龄和简短的传记等信息。我想知道这个配置文件是否应该是一个单独的模型/资源(我的用户模型中已经有很多字段,因为我正在使用 Authlogic 并且其中大部分是可选字段)。

使用单独资源的优缺点是什么?

【问题讨论】:

标签: ruby-on-rails database-design


【解决方案1】:

我会把它分开。并非所有用户都想填写个人资料,因此这些将是位于用户表中的空白字段。这也意味着您可以更改配置文件字段,而无需更改用户模型的任何逻辑。

【讨论】:

    【解决方案2】:
    • 优点:简化了每个模型
    • 缺点:同时管理 2 个有点困难

    这基本上取决于用户和个人资料的大小。如果用户是 5 个字段,而配置文件是 3 个,则没有意义。但是如果用户是 12 个字段,而个人资料是 20 个,那么你肯定应该这样做。

    【讨论】:

    • 如果它们每个都有很多字段,为什么要“肯定”拆分它们?
    【解决方案3】:

    取决于现有用户表的宽度。数据库通常对 recird 可以包含的字节数有限制。如果你接近(或者如果你有很多具有空值的字段,你通常可以做到这一点)限制,我会添加一个具有一对一关系的表以获得更好的性能和更少的记录可能性突然无法插入,因为行大小的数据太多。如果您远未达到限制,请添加到现有表中。

    【讨论】:

      【解决方案4】:

      我认为最好使用单独的模型。想想模型是如何与数据库表对应的,然后你是如何为你的应用程序支持的各种用例阅读这些模型的。

      如果用户只是偶尔访问他的实际个人资料,但用户模型经常被访问,那么您绝对应该将其设置为具有一对一关系的单独对象。如果每次需要用户数据时都需要配置文件数据,您可能希望将它们粘贴在同一个表中。

      也许每次显示用户时都需要位置(比如在他们留下的评论上),但传记应该是不同的模型?您必须找出正确的细分,但一般规则是对事物进行结构化,这样您就不必提取未立即使用的数据。

      【讨论】:

        【解决方案5】:

        为了清晰和简单,我建议在用户模型中保留配置文件列。如果您发现您只使用某些字段,请仅使用 :select 选择您需要的列。

        如果您后来发现由于某种原因需要一个单独的表(例如,一个用户可以有多个配置文件),将它们拆分出来应该不是很多工作。

        我犯了两个表的错误,它没有给我带来任何好处,只是增加了复杂性。

        【讨论】:

        • 我也有同样的经历。
        【解决方案6】:

        用户“拥有”您网站上的各种资源,例如 cmets 等。如果您将个人资料与用户分开,那么它只是一种资源。用户是静态的,而个人资料会不时变化。

        将其分开还可以让您轻松维护个人资料历史记录。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-18
          • 1970-01-01
          • 2011-11-15
          相关资源
          最近更新 更多