ট্যাগিং জন্য ডেটাবেস ডিজাইন


171

নিম্নলিখিত ট্যাগ বৈশিষ্ট্যগুলি সমর্থন করতে আপনি কীভাবে একটি ডেটাবেস ডিজাইন করবেন:

  • আইটেমগুলিতে বিশাল সংখ্যক ট্যাগ থাকতে পারে
  • প্রদত্ত ট্যাগগুলির সেট দিয়ে ট্যাগ করা সমস্ত আইটেমের অনুসন্ধানগুলি দ্রুত হওয়া উচিত (আইটেমগুলিতে অবশ্যই সমস্ত ট্যাগ থাকতে হবে, সুতরাং এটি একটি অনুসন্ধান এবং অনুসন্ধান নয়) AND
  • তাত্ক্ষণিকভাবে অনুসন্ধান / পঠন সক্ষম করতে আইটেমগুলি তৈরি করা / লেখার কাজটি ধীর হতে পারে

আদর্শভাবে, সমস্ত আইটেমগুলির অনুসন্ধানের সাথে (কমপক্ষে) এন প্রদত্ত ট্যাগগুলির একটি সেট একটি একক এসকিউএল স্টেটমেন্ট ব্যবহার করে করা উচিত। যেহেতু অনুসন্ধানের জন্য ট্যাগগুলির পাশাপাশি কোনও আইটেমের ট্যাগের সংখ্যা অজানা এবং জোয়ানগুলি ব্যবহার করা অবৈধ।

কোন ধারনা?


এখনও পর্যন্ত সমস্ত উত্তরের জন্য ধন্যবাদ।

তবে আমি যদি ভুল না হয়ে থাকি তবে প্রদত্ত উত্তরগুলি ট্যাগগুলিতে কীভাবে একটি ওআর-অনুসন্ধান করতে হয় তা দেখায়। (এক বা একাধিক এন ট্যাগ রয়েছে এমন সমস্ত আইটেম নির্বাচন করুন) আমি একটি দক্ষ এবং অনুসন্ধান অনুসন্ধান করছি। (সবগুলি আইটেম নির্বাচন করুন যাতে সমস্ত এন ট্যাগ রয়েছে - এবং সম্ভবত আরও বেশি কিছু))

উত্তর:


22

অ্যান্ডিং সম্পর্কে: মনে হচ্ছে আপনি "রিলেশনাল বিভাগ" অপারেশনটির সন্ধান করছেন। এই নিবন্ধটি সংক্ষিপ্ত এবং এখনও বোধগম্যভাবে রিলেশনাল বিভাগকে কভার করে।

পারফরম্যান্স সম্পর্কে: একটি বিটম্যাপ-ভিত্তিক পদ্ধতির স্বজ্ঞাতভাবে শোনা যাচ্ছে যা এটি পরিস্থিতিটির পক্ষে উপযুক্ত। তবে, আমি নিশ্চিত নই যে ডিজিটালুর পরামর্শ মতো বিটম্যাপ ইনডেক্সিং "ম্যানুয়ালি" প্রয়োগ করা ভাল ধারণা, এটি একটি জটিল পরিস্থিতির মতো মনে হয় যখনই নতুন ট্যাগ যুক্ত করা হয় (?) তবে কিছু ডিবিএমএস (ওরাকল সহ) বিটম্যাপ সূচী দেয় যা কোনওরকম হতে পারে ব্যবহারযোগ্য হবেন, কারণ একটি অন্তর্নির্মিত ইনডেক্সিং সিস্টেম সূচক রক্ষণাবেক্ষণের সম্ভাব্য জটিলতা সরিয়ে দেয়; তদ্ব্যতীত, ডিবিএমএসের বিটম্যাপ সূচকগুলি সরবরাহকারী কোয়েরি প্ল্যানটি সম্পাদন করার সময় সেগুলিকে যথাযথভাবে বিবেচনা করতে সক্ষম হওয়া উচিত।


4
আমাকে বলতে হবে যে উত্তরটি কিছুটা সংক্ষিপ্ত দৃষ্টিশক্তিযুক্ত, কারণ ডাটাবেসের বিট ফিল্ড ধরণের ব্যবহার আপনাকে নির্দিষ্ট সংখ্যক বিটের মধ্যে সীমাবদ্ধ করে। এর অর্থ এই নয় যে প্রতিটি আইটেম একটি নির্দিষ্ট সংখ্যক ট্যাগের মধ্যেই সীমাবদ্ধ, তবে পুরো সিস্টেমে কেবলমাত্র একটি নির্দিষ্ট সংখ্যক ট্যাগ থাকতে পারে (সাধারণত 32 বা 64 অবধি)।
মার্ক রেনুফ

1
3nf বাস্তবায়ন (প্রশ্ন, ট্যাগ, প্রশ্ন_হাস_সাগরণ) এবং প্রশ্ন_হাস_ত্যাগে ট্যাগ_আইডে একটি বিটম্যাপ সূচক ধরে নেওয়া, বিটম্যাপ সূচককে প্রতিবারই কোনও প্রশ্ন যুক্ত করা বা অপসারণের সময় পুনরায় তৈরি করতে হবে। select * from question q inner join question_has_tag qt where tag_id in (select tag_id from tags where (what we want) minus select tag_id from tags where (what we don't)মধ্যম টেবিলে সঠিক বি-ট্রি সূচি উপস্থিত রয়েছে তা ধরে নিয়ে একটি ক্যোয়ারী ঠিকঠাক হওয়া উচিত এবং স্কেল করা উচিত
অ্যাডাম মাস্ক

"এই নিবন্ধ" লিঙ্কটি মারা গেছে। আমি এটি পড়তে পছন্দ করতাম :(

3
চিহ্নিত করুন: এটি দেখতে সুন্দর দেখাচ্ছে: সরল- talk.com/sql/t-sql-programming/… এটি আমি উল্লেখ করেছি এটির সম্ভবত এটি পুনরায় প্রকাশিত সংস্করণ।
Troels আরভিন

নিবন্ধটির URL টি আর বৈধ নয়
সেবাস্তিয়ান এইচ।

77

এখানে ডেটাবেস স্কিমা ট্যাগ করার জন্য একটি ভাল নিবন্ধ:

http://howto.philippkeller.com/2005/04/24/Tags-Database-schemas/

পারফরম্যান্স পরীক্ষার পাশাপাশি:

http://howto.philippkeller.com/2005/06/19/Tagsystems-performance-tests/

মনে রাখবেন যে মাইএসকিউএলের সাথে প্রাপ্ত সিদ্ধান্তগুলি খুব সুনির্দিষ্ট রয়েছে, যা (কমপক্ষে ২০০৫ সালে লেখা হয়েছিল এমন সময়ে) খুব দুর্বল পূর্ণ পাঠ্য সূচীকরণ বৈশিষ্ট্য ছিল।


1
আপনি কীভাবে আপনি এসওয়ের সাথে ট্যাগিং সিস্টেমটি প্রয়োগ করেছেন সে সম্পর্কে আরও বিশদ প্রযুক্তিগত অন্তর্দৃষ্টি জানতে আগ্রহী? আমি একটি পডকাস্ট নিয়ে মনে করি আপনি বলেছেন যে আপনি প্রতিটি প্রশ্নের সাথে একটি কলামে সমস্ত ট্যাগ রেখেছেন এবং তারপরে সেগুলি ক্রমিক / ডি-সিরিয়ালাইজ করবেন? আমি এটি সম্পর্কে আরও জানতে এবং সম্ভবত কিছু কোড স্নিপেট দেখতে চাই would আমি চারপাশে ঘুরে দেখছি এবং কোনও বিবরণ পেয়েছি, এমটিএতে প্রশ্ন জিজ্ঞাসার আগে আপনি এখানে ইতিমধ্যে এই লিঙ্কটি তৈরি করেছেন কি?
মার্সটন এ।

5
মেটা সম্পর্কিত এই প্রশ্নটির এসও স্কিমা সম্পর্কে কিছু তথ্য রয়েছে: মেটা.স্ট্যাকেক্সেঞ্জিং
ব্যারেট

মূল লিঙ্কগুলি মারা গিয়েছিল, তবে আমি মনে করি তাদের নতুন অবস্থানটি পেয়েছি। আপনি যা যাচাই করতে চেয়েছিলেন আপনি এটি যাচাই করতে চাইতে পারেন।
ব্র্যাড লারসন

12
@ জেফ দ্বারা লিখিত হওয়া সত্ত্বেও এটি এখনও মূলত একটি লিঙ্কের উত্তর।
কৌতূহলীনি

13

আমি সোজা সমাধানের সাথে কোন সমস্যা দেখতে পাচ্ছি না: আইটেমের টেবিল, ট্যাগগুলির জন্য টেবিল, "ট্যাগিং" এর জন্য ক্রসটেবল

ক্রস টেবিলের সূচকগুলি যথেষ্ট অপ্টিমাইজেশন হওয়া উচিত। উপযুক্ত আইটেম নির্বাচন করা হবে

SELECT * FROM items WHERE id IN  
    (SELECT DISTINCT item_id FROM item_tag WHERE  
    tag_id = tag1 OR tag_id = tag2 OR ...)  

এবং ট্যাগিং হবে

SELECT * FROM items WHERE  
    EXISTS (SELECT 1 FROM item_tag WHERE id = item_id AND tag_id = tag1)  
    AND EXISTS (SELECT 1 FROM item_tag WHERE id = item_id AND tag_id = tag2)  
    AND ...

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


13

আমি কেবল হাইলাইট করতে চেয়েছিলাম যে @ জেফ অ্যাটউড যে লিখিত লিঙ্কটিতে লিঙ্ক করেছেন ( http://howto.phPLkeller.com/2005/04/24/Tags-Database-schemas/ ) খুব পুঙ্খানুপুঙ্খভাবে রয়েছে (এটি 3 টি আলাদা স্কিমার গুণাবলী নিয়ে আলোচনা করেছে) এ্যাপ্রোচ করা হয়) এবং এ্যান্ডআর কোয়েরিগুলির জন্য একটি ভাল সমাধান রয়েছে যা সাধারণত এখন পর্যন্ত এখানে উল্লিখিত হয়েছে তার চেয়ে ভাল সম্পাদন করবে (অর্থাত এটি প্রতিটি শব্দটির সাথে সম্পর্কিত সম্পর্কযুক্ত সাবকোয়ারি ব্যবহার করে না)। এছাড়াও মন্তব্যে প্রচুর ভাল স্টাফ।

PS - প্রত্যেকে এখানে যে পদ্ধতির বিষয়ে কথা বলছে সেটিকে নিবন্ধে "টক্সি" সমাধান হিসাবে উল্লেখ করা হয়েছে।


3
আমার সেই দুর্দান্ত নিবন্ধটি পড়ে মনে আছে, তবে দুর্ভাগ্যক্রমে লিঙ্কটি এখন মারা গেছে। :( এর আয়না সম্পর্কে কেউ কি জানেন?
লোকালহোস্ট

5
লিঙ্কটি মারা গিয়েছিল: <
অ্যারন

6

আপনি জাভা কনটেন্ট রিপোজিটরি বাস্তবায়ন (যেমন অ্যাপাচি জ্যাক্রাবিট ) এর মতো কোনও কঠোর-ডাটাবেস সমাধান ব্যবহার করতে এবং অ্যাপাচি লুসিনের মতো শীর্ষে নির্মিত একটি অনুসন্ধান ইঞ্জিন ব্যবহার করতে পারেন ।

উপযুক্ত ক্যাশেিং ব্যবস্থাসমূহের সাথে এই দ্রবণটি সম্ভবত বাড়ির উত্পন্ন সমাধানের চেয়ে আরও ভাল পারফরম্যান্স অর্জন করতে পারে।

তবে, আমি সত্যিই মনে করি না যে একটি ছোট বা মাঝারি আকারের অ্যাপ্লিকেশনটিতে আপনার আগের পোস্টগুলিতে উল্লিখিত সাধারণ ডাটাবেসের চেয়ে আরও পরিশীলিত প্রয়োগের প্রয়োজন হবে।

সম্পাদনা করুন: আপনার স্পষ্টতার সাথে এটি অনুসন্ধান ইঞ্জিনের সাথে জেসিআর-জাতীয় সমাধান ব্যবহার করা আরও বাধ্যতামূলক বলে মনে হচ্ছে। এটি আপনার কর্মসূচিকে দীর্ঘমেয়াদে সহজতর করবে।


5

ট্যাগ টেবিল তৈরি করা সবচেয়ে সহজ পদ্ধতি ।
Target_Type- আপনি একাধিক টেবিল ট্যাগ করার ক্ষেত্রে
Target- রেকর্ডটির চাবিকাঠিটি ট্যাগ করা হচ্ছে
Tag - - একটি ট্যাগ এর পাঠ্য

ডেটা জিজ্ঞাসা করা কিছু হতে পারে:

Select distinct target from tags   
where tag in ([your list of tags to search for here])  
and target_type = [the table you're searching]

আপডেট
আপনার শর্তাবলী এবং শর্তাবলীর উপর ভিত্তি করে উপরের ক্যোয়ারীটি এরকম কিছুতে পরিণত হবে

select target
from (
  select target, count(*) cnt 
  from tags   
  where tag in ([your list of tags to search for here])
    and target_type = [the table you're searching]
)
where cnt = [number of tags being searched]

1

আমি জিৎজেঙ্কসের দ্বিতীয় পরামর্শ চাইছিলাম যে আপনি এমন কিছু চান যা পুরোপুরি (আর) ডিবি কেন্দ্রিক নয়

একরকম, আমি বিশ্বাস করি যে কিছু সঠিক ক্যাচিং / ইনডেক্সিং সহ ট্যাগগুলি সঞ্চয় করতে প্লে এনভারচার ক্ষেত্রগুলি ব্যবহার করা দ্রুত ফলাফল পেতে পারে। তবে তা কেবল আমিই।

আমি অনেকগুলি টু-অনেক সম্পর্কের (আইটেম ট্যাগস আইটেম ট্যাগস) প্রতিনিধিত্ব করতে 3 টি টেবিল ব্যবহার করে ট্যাগিং সিস্টেমগুলি প্রয়োগ করেছি, তবে আমি মনে করি আপনি অনেক জায়গাতে ট্যাগ ব্যবহার করছেন, আমি আপনাকে বলতে পারি যে 3 টি টেবিলের সাথে একসাথে হেরফের / জিজ্ঞাসা করা সমস্ত সময় অবশ্যই আপনার কোডটিকে আরও জটিল করে তুলবে।

যুক্ত জটিলতাটি উপযুক্ত কিনা তা আপনি বিবেচনা করতে চাইতে পারেন।


0

আপনি যোগদান এড়াতে পারবেন না এবং এখনও কিছুটা স্বাভাবিক হয়ে উঠবেন।

আমার পদ্ধতির একটি ট্যাগ টেবিল আছে।

 TagId (PK)| TagName (Indexed)

তারপরে, আপনার আইটেম সারণিতে একটি ট্যাগএক্সআরআইএফআইডি কলাম রয়েছে।

এই TagXREFID কলামটি 3 য় টেবিলের এফকে, আমি এটিকে ট্যাগএক্সআরএফ বলব:

 TagXrefID | ItemID | TagId

সুতরাং, একটি আইটেমের জন্য সমস্ত ট্যাগ পেতে কিছু হবে:

SELECT Tags.TagId,Tags.TagName 
     FROM Tags,TagXref 
     WHERE TagXref.TagId = Tags.TagId 
         AND TagXref.ItemID = @ItemID

এবং একটি ট্যাগের জন্য সমস্ত আইটেম পেতে, আমি এই জাতীয় কিছু ব্যবহার করব:

SELECT * FROM Items, TagXref
     WHERE TagXref.TagId IN 
          ( SELECT Tags.TagId FROM Tags
                WHERE Tags.TagName = @TagName; )
     AND Items.ItemId = TagXref.ItemId;

একসাথে একসাথে ট্যাগ করার জন্য, আপনি ও ও ট্যাগগুলি যোগ করতে উপরের বিবৃতিটি কিছুটা সংশোধন করতে চান ag ট্যাগ্যাগনেম = @ ট্যাগনাম 1 এবং ট্যাগস T ট্যাগনাম = @ ট্যাগনাম 2 ইত্যাদি ... এবং গতিশীলভাবে কোয়েরিটি তৈরি করুন।


0

আমি যা করতে চাই তা হ'ল কয়েকটি টেবিল যা কাঁচা ডেটা উপস্থাপন করে, তাই এক্ষেত্রে আপনার থাকতে হবে

Items (ID pk, Name, <properties>)
Tags (ID pk, Name)
TagItems (TagID fk, ItemID fk)

এটি লেখার সময়গুলির জন্য দ্রুত কাজ করে এবং সবকিছুকে স্বাভাবিক রাখে, তবে আপনি এটিও খেয়াল করতে পারেন যে প্রতিটি ট্যাগের জন্য আপনাকে এবং আপনার পরবর্তী প্রতিটি ট্যাগের জন্য টেবিলগুলিতে দু'বার যোগ দিতে হবে, সুতরাং এটি ধীরে ধীরে পড়েছে।

পড়ার উন্নতির সমাধান হ'ল কমান্ডে ক্যাচিং টেবিল তৈরি করা একটি সঞ্চিত প্রক্রিয়া স্থাপন করে যা মূলত এমন একটি নতুন সারণী তৈরি করে যা সমতল বিন্যাসে ডেটা উপস্থাপন করে ...

CachedTagItems(ID, Name, <properties>, tag1, tag2, ... tagN)

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

ডেটা পুনরুদ্ধারে এখন সত্যিই চতুর হওয়ার জন্য, আপনি ট্যাগগুলি থেকে ডেটা পেতে একটি সঞ্চিত পদ্ধতি তৈরি করতে চান। বৃহত কেস স্টেটমেন্টে নেস্টেড ক্যোয়ারী ব্যবহার না করে আপনি ডাটাবেস থেকে নির্বাচন করতে চান এমন ট্যাগগুলির একটি তালিকা থাকা একটি একক প্যারামিটারে পাস করতে চান এবং আইটেমের একটি রেকর্ড সেট ফিরে আসতে চান। এটি বিটওয়াইজ অপারেটরগুলি ব্যবহার করে বাইনারি ফর্ম্যাটে সেরা হবে।

বাইনারি বিন্যাসে, এটি ব্যাখ্যা করা সহজ। ধরা যাক যে কোনও আইটেমকে অর্পণ করার জন্য চারটি ট্যাগ রয়েছে, বাইনারিতে আমরা এটি উপস্থাপন করতে পারি

0000

যদি চারটি ট্যাগ কোনও অবজেক্টকে অর্পণ করা হয় তবে অবজেক্টটি এর মতো দেখায় ...

1111

যদি প্রথম দুটি ...

1100

তারপরে এটি আপনার পছন্দসই কলামে 1 টি এবং শূন্যগুলির সাথে বাইনারি মানগুলি সন্ধান করার ক্ষেত্রে কেবল একটি ঘটনা। এসকিউএল সার্ভারের বিটওয়াইস অপারেটরগুলি ব্যবহার করে, আপনি খুব সাধারণ প্রশ্নগুলি ব্যবহার করে কলামের প্রথমটিতে 1 টি আছে তা পরীক্ষা করতে পারেন।

আরও জানতে এই লিঙ্কটি দেখুন


0

অন্যেরা যা বলেছে তা বোঝাতে: কৌশলটি স্কিমায় নেই , এটি ক্যোয়ারীতে রয়েছে

সত্তা / লেবেল / ট্যাগগুলির নিষ্পাপ স্কিমা হ'ল সঠিক উপায়। তবে আপনি যেমন দেখেছেন, কীভাবে প্রচুর ট্যাগ সহ একটি ও ক্যোয়ারী সঞ্চালন করবেন তা অবিলম্বে পরিষ্কার হয়ে যায় না।

এই ক্যোয়ারীটিকে অনুকূলিত করার সর্বোত্তম উপায়টি প্ল্যাটফর্ম নির্ভর,

আমার কাছে এমএস এসকিউএল-এর জন্য কয়েকটি পরামর্শ রয়েছে তবে আপনি যে প্ল্যাটফর্মটি ব্যবহার করছেন তা যদি না হয় তবে তা পরিহার করব।


6
আপনার সম্ভবত কোনও নির্দিষ্ট প্রযুক্তি সম্পর্কে টিডবিট দেওয়া থেকে বিরত থাকা উচিত নয় কারণ এই সমস্যাযুক্ত ডোমেনে কাজ করার চেষ্টা করা অন্যান্য ব্যক্তিরা সম্ভবত সেই প্রযুক্তি ব্যবহার করছেন এবং উপকার পাবেন।
ব্রায়ান রেহবেইন

0

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


4
এই পদ্ধতির সাহায্যে আপনি ঠিক একই ট্যাগের সেটগুলির সাহায্যে প্রবেশের সন্ধান করতে পারেন - এটি সর্বদা তুচ্ছ। আমার আসল প্রশ্নে আমি যে সমস্ত ট্যাগের জন্য জিজ্ঞাসা করেছি সেগুলি এবং সম্ভবত আরও অনেকগুলি সন্ধান করতে চাই।
ক্রিশ্চান বার্গ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.