रूबी ऑन रेल्स में कई कॉलमों पर सूचकांक


97

मैं यह ट्रैक करने के लिए कार्यक्षमता लागू कर रहा हूं कि उपयोगकर्ता ने कौन से लेख पढ़े हैं।

  create_table "article", :force => true do |t|
    t.string   "title"
    t.text     "content"
  end

यह मेरा अब तक का प्रवास है:

create_table :user_views do |t|
  t.integer :user_id
  t.integer :article_id
end

User_views तालिका हमेशा दोनों स्तंभों को देखने के लिए क्वियर होगी, कभी भी एक ही नहीं। मेरा प्रश्न यह है कि मेरा सूचकांक कैसा दिखना चाहिए। क्या इन तालिकाओं के क्रम में कोई अंतर है, क्या इसके लिए कुछ और विकल्प होना चाहिए या जो भी हो। मेरा लक्ष्य DB Postgres है।

add_index(:user_views, [:article_id, :user_id])

धन्यवाद।

अद्यतन:
क्योंकि दोनों स्तंभों में समान मान वाली केवल एक ही पंक्ति मौजूद हो सकती है (क्योंकि यह जानने के बाद कि क्या user_id is read article_id है), क्या मुझे इस पर विचार करना चाहिए: अद्वितीय विकल्प? अगर मैं गलत नहीं हूँ तो इसका मतलब है कि मुझे अपने आप कोई जाँच करने की ज़रूरत नहीं है और हर बार जब कोई उपयोगकर्ता किसी लेख पर जाता है तो हर बार एक प्रविष्टि करता है।


"User_views तालिका हमेशा दोनों स्तंभों को देखने के लिए क्वियर होगी, कभी भी एक ही नहीं।" - कभी भी "उन सभी लेखों को खोजें, जिन्हें इस उपयोगकर्ता ने देखा है", या "उन सभी उपयोगकर्ताओं को खोजें, जिन्होंने इस लेख को देखा है" क्वेरी? मुझे वह आश्चर्यचकित करता है।
डेविड एल्ड्रिज

जवाबों:


215

क्रम अनुक्रमण में मायने रखता है।

  1. सबसे चयनात्मक क्षेत्र को पहले रखो, यानी वह क्षेत्र जो सबसे तेजी से पंक्तियों की संख्या को कम करता है।
  2. अनुक्रमणिका का उपयोग केवल तब ही किया जाएगा जब आप इसके स्तंभों को अनुक्रम में शुरुआत में उपयोग करते हैं । यदि आप पर इंडेक्स करते हैं [:user_id, :article_id], तो आप user_idया पर तेज़ क्वेरी कर सकते हैं user_id AND article_id, लेकिन नहीं article_id

आपकी माइग्रेशन add_indexलाइन कुछ इस तरह दिखनी चाहिए:

add_index :user_views, [:user_id, :article_id]

'अद्वितीय' विकल्प के संबंध में प्रश्न

रेल में ऐसा करने का एक आसान तरीका validatesआपके मॉडल uniquenessमें निम्न प्रकार से उपयोग करना है ( प्रलेखन ):

validates :user, uniqueness: { scope: :article }

7
आदेश अनुक्रमण में बहुत मायने रखता है। जहां बाईं ओर क्लॉस होता है और ऑर्डर करने वाले कॉलम को दाईं ओर से पूरा करें। stackoverflow.com/questions/6098616/dos-and-donts-for-indexes
डेनिस डे बर्नार्डी

1
ध्यान दें कि validates_uniqueness_of(और उसके चचेरे भाई, validates uniqueness:) दौड़ की स्थिति के लिए प्रवण हैं
बेन

1
जैसा कि ऊपर टिप्पणियों में बताया गया है और stackoverflow.com/a/1449466/5157706 और stackoverflow.com/a/22816105/5157706 , डेटाबेस पर भी अद्वितीय सूचकांक जोड़ने पर विचार करें।
आकाश अग्रवाल

25

सूचकांक पर बनाम सत्यापन समय पर विशिष्टता की जांच करने के बारे में एक चेतावनी: उत्तरार्द्ध डेटाबेस द्वारा किया जाता है जबकि प्राइमर मॉडल द्वारा किया जाता है। चूंकि एक ही समय में एक मॉडल के कई समवर्ती उदाहरण हो सकते हैं, सत्यापन दौड़ की स्थिति के अधीन है, जिसका अर्थ है कि यह कुछ मामलों में डुप्लिकेट का पता लगाने में विफल हो सकता है (उदाहरण के लिए उसी समय दो बार एक ही फॉर्म जमा करें)।


तो कौन सा बेहतर है? डेटाबेस साइड या वैरिडेट्स_इनीकनेस_ऑफ़?
WM

9
दोनों। validates_uniqueness_of का उपयोग किसी त्रुटि संदेश को उदाहरण के लिए अनुप्रयोग में उस समय प्रदर्शित करने के लिए किया जा सकता है जब कोई फ़ॉर्म सहेजा जाता है। डेटाबेस की कमी यह सुनिश्चित करती है कि आप मॉडल में निर्दिष्ट सत्यापन भी जानते थे कि आप किसी रिकॉर्ड के साथ समाप्त नहीं होंगे। साथ ही, आप ActiveRecord अपवाद को बचा सकते हैं और उपयोगकर्ता को एक अच्छा संदेश भी दिखा सकते हैं।
उइस ओज़ोल्स

5
@ यदि आपको एक चुनना है, तो डेटाबेस बाधा के साथ जाएं। यह तब भी काम करेगा जब विभिन्न, गैर आरओआर अनुप्रयोग आपके डेटा के साथ बातचीत करते हैं, और दीर्घकालिक के लिए स्थिरता सुनिश्चित करते हैं।
मूरेड्स 19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.