Ruby on rails 我真的需要使用活动记录为rails中的子表提供ID吗?
我有一个用户模型(sql表),它有一个配置文件。 配置文件具有用户id以引用用户对象。 我真的需要有profile\u id列吗 优点和缺点是什么? 我想一个优势是桌子的大小要小1米。Ruby on rails 我真的需要使用活动记录为rails中的子表提供ID吗?,ruby-on-rails,database,database-design,Ruby On Rails,Database,Database Design,我有一个用户模型(sql表),它有一个配置文件。 配置文件具有用户id以引用用户对象。 我真的需要有profile\u id列吗 优点和缺点是什么? 我想一个优势是桌子的大小要小1米。 缺点是什么?由于配置文件的属于:user关联,如果希望下次从数据库加载对象时关联可用,最好将用户id存储在配置文件表中。真的没有别的办法了。但是,对于相反的关联,您当然不需要profile\u id列。Rails非常聪明,在解释用户的关联时可以查看profiles表 这就是说,一般来说,单个整数数据库列的成本没有
缺点是什么?由于配置文件的
属于:user
关联,如果希望下次从数据库加载对象时关联可用,最好将用户id
存储在配置文件
表中。真的没有别的办法了。但是,对于相反的关联,您当然不需要profile\u id
列。Rails非常聪明,在解释用户的关联时可以查看profiles
表
这就是说,一般来说,单个整数数据库列的成本没有什么可担心的。在这种情况下,您不需要整数列,但考虑到用户的电子邮件地址将在存储字节和索引大小方面大几倍。
顺便说一下,使用profile\u id
列有一些缺点。据我所知,如果在aUser
上重新分配profile
属性,Rails甚至不会自动更新列。该行为是属于
关联的所特有的
此外,在关系数据库中存储冗余信息是一件麻烦事,因为这会增加收缩的可能性。如果用户1指向配置文件1,但配置文件1指向用户2,您如何解释?在两个多余的事实中,你相信哪一个?如果一个事实总是比另一个更可信,那么存储第二个事实又有什么意义呢?这与您的问题有点相切,但我认为值得一提。您的profiles表不需要profile\u id列。它已经有id
,并且属于用户
,所以您只需要在profiles表中找到用户id
。外键(配置文件所属对象的id)位于所属\u to
之后
Profile has_one :user
User belongs_to :profile
# User table includes its own id ('id') and profile_id for the belongs_to
User has_one :profile
Profile belongs_to :user
# Profile table includes its own id ('id) as well as user_id for the belongs_to
不需要。您不需要id。但需要主键,它可能是表中的其他列。当然,主键意味着该值必须是唯一的且不为null
只需创建不带id列的表:
create_table "profiles", :id => false, primary_key => 'user_id' do |t|
t.integer "user_id"
#...
end
然后在模型中:
class Profile < ActiveRecord::Base
set_primary_key 'user_id'
end
类配置文件
该表不应创建自动增量或sequencer,只需检查一下即可。如果您使用的是关联方法(user.profile.create(…)
),则应通过您或框架设置该值
缺点:一些插件可能希望“id”是PK,但这意味着它们编写得很糟糕。我认为没有缺点,假设它确实是一个重复的列,并且不是会破坏某些现有代码的遗留代码
另一个优点是Rails遵循约定。其中之一是主键是名为id
的列,因为许多其他方法都依赖它。如果你打破惯例,你将不得不调整代码的其他部分,避免Rails自动带来的优势(他们说,他们会来咬你)只是一个更正:我真的需要在配置文件表中设置配置文件id列吗?只是第二个更正:我真的需要在配置文件表中设置id列吗?只是第二个更正:我是指配置文件表中的id列