রুবেল অন রিলে একাধিক কলামে সূচি Ind


98

একজন ব্যবহারকারী কোন নিবন্ধ পড়েছেন তা ট্র্যাক করতে আমি কার্যকারিতা বাস্তবায়ন করছি।

  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

ইউজার_ভিউস টেবিলটি সর্বদা উভয় কলাম অনুসন্ধান করার জন্য জিজ্ঞাসা করা হবে, কেবলমাত্র একটিই নয়। আমার প্রশ্নটি আমার সূচকটি কেমন হওয়া উচিত। এই টেবিলগুলির ক্রমটিতে কি কোনও পার্থক্য রয়েছে, এটিতে কিছু বা আরও কিছু বিকল্প থাকা উচিত। আমার টার্গেট ডিবি পোস্টগ্রিস।

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

ধন্যবাদ

আপডেট:
যেহেতু উভয় কলামে একই মান সমেত একটি মাত্র সারি বিদ্যমান থাকতে পারে (যেহেতু ব্যবহারকারী_আইডি নিবন্ধ_আইডি পড়েছে কিনা তা জানতে পেরে), আমি কি: অনন্য বিকল্পটি বিবেচনা করব? যদি আমি ভুল না হয়ে থাকি তবে এর অর্থ হ'ল আমাকে নিজেই কোনও চেকিং করতে হবে না এবং ব্যবহারকারী যখনই কোনও নিবন্ধ দেখার জন্য প্রতিবার সন্নিবেশ করান।


"ব্যবহারকারী_দর্শন টেবিলটি সর্বদা উভয় কলাম অনুসন্ধান করার জন্য জিজ্ঞাসা করা হবে, কেবলমাত্র একটিই নয়" " - "এই ব্যবহারকারী দেখেছে এমন সমস্ত নিবন্ধ সন্ধান করুন", বা "এই নিবন্ধটি দেখেছেন এমন সমস্ত ব্যবহারকারী খুঁজে পাবেন না" কোয়েরি কখনই হবে না? আমি যে অবাক লাগে।
ডেভিড অলড্রিজ

উত্তর:


219

আদেশটি সূচকের ক্ষেত্রে গুরুত্বপূর্ণ।

  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-douts-for-indexes
ডেনিস ডি বার্নার্ডি

4
নোট করুন validates_uniqueness_of(এবং এর কাজিন, validates uniqueness:) রেসের অবস্থার ঝুঁকিতে রয়েছে
বেন অউবিন

4
উপরের মন্তব্যে এবং স্ট্যাকওভারফ্লো. com/ a / 1449466/ 5157706 এবং স্ট্যাকওভারফ্লো. com / a/ 22816105 / 5157706 হিসাবে উল্লিখিত হিসাবে , ডাটাবেসে অনন্য সূচক যুক্ত করার বিষয়টিও বিবেচনা করুন।
আকাশ আগারওয়াল

25

সূচীতে বৈধতার সময়ে স্বতন্ত্রতা পরীক্ষা করার বিষয়ে কেবল একটি সতর্কতা: আধুনিকটি মডেল দ্বারা প্রাইমারটি সম্পন্ন করার সময় ডাটাবেস দ্বারা সম্পন্ন হয়। যেহেতু একই সময়ে চলমান কোনও মডেলের বেশ কয়েকটি সমকালীন দৃষ্টান্ত থাকতে পারে, তাই বৈধতাটি জাতিদের শর্ত সাপেক্ষে, যার অর্থ এটি কোনও ক্ষেত্রে সদৃশ সনাক্ত করতে ব্যর্থ হতে পারে (উদাহরণস্বরূপ, একই সময়ে দু'বার একই ফর্ম জমা দিন)।


তাহলে কোনটি ভাল? ডাটাবেস পাশ বা বৈধতা_ ইউনিকিউনেস_?
ডাব্লুএম

9
দুটোই। বৈধতা_সামগ্রী_এফটি প্রয়োগে উদাহরণস্বরূপ যখন কোনও ফর্ম সংরক্ষণ করা হয় ত্রুটি বার্তা প্রদর্শন করতে ব্যবহার করা যেতে পারে। ডেটাবেস সীমাবদ্ধতা নিশ্চিত করবে যে আপনি ডুপ রেকর্ডগুলি দিয়ে শেষ করবেন না এমনকি আপনি জানেন যে মডেলটিতে আপনার বৈধতা নির্দিষ্ট রয়েছে। এছাড়াও, আপনি অ্যাক্টিভেকর্ড ব্যতিক্রমটি উদ্ধার করতে পারেন এবং ব্যবহারকারীর কাছে একটি দুর্দান্ত বার্তাও প্রদর্শন করতে পারেন।
উয়েস ওজলস

4
@ ডাব্লুএম আপনার যদি একটি বাছাই করতে হয় তবে ডাটাবেস সীমাবদ্ধতার সাথে যান। বিভিন্ন, আরআরবিহীন অ্যাপ্লিকেশনগুলি আপনার ডেটার সাথে ইন্টারঅ্যাক্ট করে এবং দীর্ঘমেয়াদীর জন্য ধারাবাহিকতা নিশ্চিত করে এমনকি এটি কাজ করবে।
moorss
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.