为什么Rails迁移在应用程序中定义外键但不在数据库中定义外键?

为什么Rails迁移在应用程序中定义外键但不在数据库中定义外键?

如果我定义一个CustomerOrder模式,其中Customer “有很多” OrdersOrder “属于” Customer ,在Rails中,我们通过customer_idCustomer customer_id有一个外部Order ,但我们并不意味着在数据库中执行。

因为Rails没有将其定义为数据库级约束,否则存在违反数据完整性的风险,也许在应用程序之外(或者如果您收到同时发送的请求,还是在内部),除非您手动在数据库中强制执行约束。

为什么Rails没有在数据库级别定义外键,还是有办法让Rails这样做?

class Customer < ActiveRecord::Base
  has_many :orders
end

class Order < ActiveRecord::Base
    belongs_to :customer
end

ActiveRecord::Schema.define(:version => 1) do

  create_table "customers", :force => true do |t|
    t.string   "name"
  end

  create_table "orders", :force => true do |t|
    t.string   "item_name"
    t.integer  "customer_id"
  end

end
采纳答案:

Rails有一些约定,应该在应用程序中执行数据完整性,而不是数据库。

例如,Rails甚至支持一些不能使用外键的数据库设计,如多形态关联。

基本上,Rails约定将数据库视为静态数据存储设备,而不是活动的RDBMS。 Rails 2.0 终于支持SQL数据库的一些更逼真的功能。 这并不奇怪,使用Rails开发的结果将比1.0版更复杂。

参考更多解答:为什么Rails迁移在应用程序中定义外键但不在数据库中定义外键?,转载请保留为什么Rails迁移在应用程序中定义外键但不在数据库中定义外键?

更多:database