วิธีใช้ดัชนีเฉพาะบนสองคอลัมน์ในราง


96

ฉันมีตารางและฉันกำลังพยายามเพิ่มดัชนีเฉพาะในสองคอลัมน์ คอลัมน์เหล่านั้นจะถูกจัดทำดัชนีด้วย ดังนั้นคำถามของฉันคือถ้าฉันสามารถลบดัชนีที่เป็นเพียงคอลัมน์เดียวหรือถ้าฉันต้องใช้ดัชนีทั้งสาม:

add_index "subscriptions", ["user_id"]
add_index "subscriptions", ["content_id"]
add_index "subscriptions", ["user_id"], ["content_id"], :unique => true

5
หมายเหตุด้านข้าง: หากคุณใช้ MySQL จะไม่มีเหตุผลที่จะมีดัชนีของคุณused_idและcontent_idแยกต่างหากหากคุณมีดัชนีที่ไม่ซ้ำกันของทั้งสองคอลัมน์ สิ่งนี้อาจนำไปใช้กับฐานข้อมูลอื่น ๆ ได้เช่นกัน ... ตรงกันข้ามกับสิ่งที่คุณคาดหวังมันจะส่งผลเสียต่อประสิทธิภาพการทำงาน (โดยเฉพาะการแทรก / อัปเดต)
hurikhan77

คำตอบ:


190
add_index :subscriptions, [:user_id, :content_id], unique: true

6
มีไวยากรณ์ทางเลือกเช่นกัน: add_index: การสมัครสมาชิก, [: user_id,: content_id],: unique => true add_index: การสมัครสมาชิก,% w (user_id content_id),: unique => true เป็นสิ่งเดียวกันเพียงแค่ไวยากรณ์ที่ต่างกัน สำหรับการระบุคอลัมน์
François Beausoleil

14
@ FrançoisBeausoleil %w(user_id content_id)ในทับทิมเพียงแค่สร้างสตริงอาร์เรย์ไม่ใช่พิเศษสำหรับราง คุณสามารถทำได้เช่นเดียวกันกับ"user_id content_id".splitการสร้างอาร์เรย์ของสตริง ฉันแน่ใจว่าคุณรู้เรื่องนี้ความคิดเห็นนี้เป็นเพียงเพื่อให้ผู้อ่านคนอื่น ๆ ไม่เกี่ยวข้องกับเรื่องนี้กับทางรถไฟอย่างไม่ถูกต้อง :)
Khaja Minhajuddin

ไวยากรณ์สำหรับสิ่งนี้ในการสร้างตารางคืออะไร? <- พบคำตอบ ( stackoverflow.com/questions/4870961/… )
tnaught

ฉันมีปัญหาแปลก ๆ หลังจากใช้สิ่งนี้ ไม่สามารถเรียกใช้การย้ายข้อมูลใหม่โดยใช้ rake db: migrate สามารถเรียกใช้การย้ายข้อมูลโดยใช้หมายเลขเวอร์ชัน rake db: migrate: up VERSION = 20180411062714 ทีละไฟล์เท่านั้น ฉันมีข้อมูลบนตารางที่ฉันทำจริงเฉพาะในสองคอลัมน์แล้ว
thedudecodes

1
@ FrançoisBeausoleilจริงๆแล้วพวกมันไม่ใช่สิ่งเดียวกัน%w(user_id content_id)คือ Array of Strings ซึ่งก็เหมือนกับ['user_id', 'content_id']. สัญกรณ์ที่แตกต่างกันสำหรับ Array of Symbols คือ%i(user_id content_id)หรือตามที่ OP เขียนไว้[:user_id, :content_id]
Sasa Blagojevic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.