Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 我真的需要使用活动记录为rails中的子表提供ID吗?_Ruby On Rails_Database_Database Design - Fatal编程技术网

Ruby on rails 我真的需要使用活动记录为rails中的子表提供ID吗?

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表 这就是说,一般来说,单个整数数据库列的成本没有

我有一个用户模型(sql表),它有一个配置文件。 配置文件具有用户id以引用用户对象。 我真的需要有profile\u id列吗

优点和缺点是什么? 我想一个优势是桌子的大小要小1米。
缺点是什么?

由于配置文件的
属于:user
关联,如果希望下次从数据库加载对象时关联可用,最好将
用户id
存储在
配置文件
表中。真的没有别的办法了。但是,对于相反的关联,您当然不需要
profile\u id
列。Rails非常聪明,在解释
用户的
关联时可以查看
profiles

这就是说,一般来说,单个整数数据库列的成本没有什么可担心的。在这种情况下,您不需要整数列,但考虑到用户的电子邮件地址将在存储字节和索引大小方面大几倍。

顺便说一下,使用
profile\u id
列有一些缺点。据我所知,如果在a
User
上重新分配
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列