7

Sau một hướng dẫn viên, tôi chạy lệnh sau đây:index: đúng vs foreign_key: true (Rails)

rails g migration CreateSnippetsUsers snippet:belongs_to user:belongs_to 

này tạo ra sự di cư sau:

class CreateSnippetsUsers < ActiveRecord::Migration[5.0] 
    def change 
    create_table :snippets_users do |t| 
     t.belongs_to :snippet, foreign_key: true 
     t.belongs_to :user, foreign_key: true 
    end 
    end 
end 

Trong quá khứ tôi đã nhìn thấy điều tương tự, nhưng với index: true thay vì foreign_key: true. Sự khác nhau giữa hai cái là gì?

+0

http://stackoverflow.com/questions/22815009/add-a-reference-column-migration-in-rails-4 có thể điều này sẽ giúp – Bijendra

Trả lời

0

Để có hiệu suất tốt, bạn có thể thêm index: trueforeign_key: true nhưng không bắt buộc.

Chỉ mục cung cấp các tùy chọn tốt hơn cho tìm kiếm trong cơ sở dữ liệu, do đó, nó nhanh hơn.

Khóa ngoại thực thi tính toàn vẹn tham chiếu. Bạn có thể đọc thêm về khóa ngoài here

+0

Đó là thông tin nguy hiểm. Chỉ số cung cấp hiệu quả READ tốt hơn. Việc giao dịch là WRITES chậm hơn – TheRealMrCrowley

7

Chỉ mục cải thiện tốc độ hoạt động truy xuất dữ liệu trên bảng cơ sở dữ liệu. Khi chúng tôi viết index: true vào bất kỳ cột nào, nó sẽ thêm một chỉ mục cơ sở dữ liệu vào cột này. Ví dụ tôi đã tạo ra một bảng:

create_table :appointments do |t| 
     t.references :student, index: true 
    end 

Nó sẽ tạo ra student_id cột trong appointments bảng.

Khóa ngoại có trường hợp sử dụng khác nhau, đó là mối quan hệ giữa các bảng. Nó cho phép chúng ta khai báo một chỉ mục trong một bảng có liên quan đến một chỉ mục trong bảng khác và cũng có một số ràng buộc được đặt. Cơ sở dữ liệu thực thi các quy tắc của mối quan hệ này để duy trì tính toàn vẹn tham chiếu. Ví dụ: chúng tôi có hai bảng profileseducations và tiểu sử có thể có nhiều kiến ​​thức.

create_table :educations do |t| 
    t.belongs_to :profile, index: true, foreign_key: true 
end 

Bây giờ chúng ta có profile_id cột trong bảng educations đó là chìa khóa nước ngoài của profiles bảng. Nó ngăn không cho bản ghi được nhập vào bảng educations trừ khi nó chứa giá trị profile_id tồn tại trong bảng profiles. Vì vậy, tính toàn vẹn tham chiếu sẽ được duy trì.

+0

Woudn't 't.references: student' tạo cột' student_id' trong bảng 'appointments'? Nếu vậy, 'index: true' làm gì? – Mirror318

+0

chỉ mục: true lập chỉ mục tại đây. –

Các vấn đề liên quan