【问题标题】:How to design database tables for different types of Users?如何为不同类型的用户设计数据库表?
【发布时间】:2020-08-22 17:51:02
【问题描述】:

我在一个包含 Rails、Postgresql 和 Active Record 的项目中,我有用户,可以是影响者,也可以是创作者。

用户有emailpasswordfirst_namelast_name等常用列,但是:

  • 影响者将拥有followerseg_rateaccount
  • 创作者将拥有SIRET_numberspecialty

如何设计我的数据库,让影响者和创作者成为用户表的“孩子”?我的意思是,是否有可能有一个数据库,我可以通过一个查询访问用户的关注者或用户的专业,或者我总是需要进行多个查询才能实现这一点?我尝试为每个表创建三个表,外键 user_id 在 Influencers 表和 Creators 表中。我还尝试将user_type 列添加到我的用户表中,我在其中传递“影响者”或“创建者”的值​​,但我对如何链接每个表有点迷失......

谢谢大家。

【问题讨论】:

    标签: ruby-on-rails database postgresql types


    【解决方案1】:

    你的方法是对的。

    您可以使用公共列创建表users,并向influencerscreators 表添加外键。

    那么当你需要取回数据时,你可以使用ActiveRecord关系轻松获取数据,并使用ActiveRecord的includes方法进行关系。

    例如:

    class Creator < ActiveRecord::Base
       # The relation must be set
       has_one :user
    end
    
    # To fetch data anywhere else:
    Creator.find_by(SIRET_number: 1234).includes(:user)
    

    如果您需要通过相关用户表中的属性检索创建者或影响者,您可以使用joins

    Creator.joins(:users).where(users: {email: "foo@bar.com"})
    

    确保您在 User 和 Creator 模型中都设置了关系。 查看this topic 了解更多信息。

    通过使用包含或连接而不是使用creator.user,您将避免不必要的额外查询。缺点是语法现在更长了,您可以创建自己的 getter 来轻松检索数据,而不是每次都编写“包含”。

    另外假设您不知道这种方法,我建议您阅读有关 Rails 和 ActiveRecord 的常见 N+1 问题。同样的方法可以为你解决很多问题。

    【讨论】:

    • 非常感谢您的回答。我在 AR 关系中遇到的问题是ActiveRecord::StatementInvalid (PG::UndefinedColumn: ERROR: column creators.email does not exist)。 “从influencerscreatorstable 向其中添加外键”是什么意思?不是相反吗?我的意思是,在我的影响者和创作者表中,我有一个user_idforeign_key 列。不确定是否正确理解您的建议。
    • “添加外键”是指您已经创建的当前 user_id 列,它已经设置好了。
    • 电子邮件的问题是电子邮件是用户表中的一列,而不是创建者,因此您不能在创建者查询中使用该属性。
    猜你喜欢
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    相关资源
    最近更新 更多