您是否有任何理由可能不希望在关联中使用foreign_key?

时间:2009-05-28 16:37:00

标签: ruby-on-rails database foreign-keys associations

如果你有

Parent
 has_many :children

Child

是否有理由在Child(对父)和相应的belongs_to :parent上设置外键可能不合适?

如果有的话,您是否希望您的孩子能够访问其父母?

2 个答案:

答案 0 :(得分:4)

这是一种权衡。针对外键的通常参数是外键的索引在插入/更新/删除时会产生一些性能开销。 就像任何索引一样。

但是,当您通过该列进行搜索时,索引也会带来很大的好处。

SELECT * FROM Child WHERE parent_id = :id 

另外,不要低估搜索孤儿和清理bollixed引用的开销,这是省略外键约束的必然结果。

-- Typical chore: searching for orphaned child rows.

SELECT c.* FROM Child c LEFT OUTER JOIN Parent p 
  ON (c.parent_id = p.parent_id) 
WHERE p.parent_id IS NULL;

还有一些数据库设计,其中无法使用外键,例如Polymorphic Associations或Entity-Attribute-Value。但这些设计本身就是反模式。

答案 1 :(得分:1)

性能。插入子记录以确定是否存在父记录时会产生成本。您仍然可以访问父记录(假设您在子表中有一个parentID列,没有参照完整性)。