如果你有
Parent
has_many :children
Child
是否有理由在Child(对父)和相应的belongs_to :parent
上设置外键可能不合适?
如果有的话,您是否希望您的孩子能够访问其父母?
答案 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列,没有参照完整性)。