ট্যাগ বা ট্যাগ করার জন্য প্রস্তাবিত এসকিউএল ডাটাবেস ডিজাইন [বন্ধ]


288

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

আমি ট্যাগের জন্য একটি সেরা অনুশীলন মিস করছি?


9
ঠিক আছে এটি প্রশ্ন # 20856, (প্রায়) একই প্রশ্নটি # 48475 এই প্রশ্নটি জিজ্ঞাসা করার কমপক্ষে দুই সপ্তাহ পরে জিজ্ঞাসা করা হয়েছিল?
dlamblin

9
আর একটি আকর্ষণীয় প্রশ্ন "এসও কিভাবে ট্যাগগুলি প্রয়োগ করে?"
মোস্তফা

1
আরেকটি আকর্ষণীয় প্রশ্ন "আপনি কি তাদের আন্তর্জাতিককরণ করবেন, এবং যদি তা হয় তবে কীভাবে?"
ড্যানমান

1
জবর তুলনা (Postgres নির্দিষ্ট): databasesoup.com/2015/01/tag-all-things.html
a_horse_with_no_name

উত্তর:


406

তিনটি টেবিল (সমস্ত আইটেম সংরক্ষণের জন্য একটি, সমস্ত ট্যাগের জন্য একটি এবং দুটির মধ্যে সম্পর্কের জন্য একটি), সঠিকভাবে ইনডেক্স করা, একটি সঠিক ডাটাবেসে বিদেশী কী সেট চলমান সহ, ভালভাবে কাজ করা উচিত এবং সঠিকভাবে স্কেল করা উচিত।

Table: Item
Columns: ItemID, Title, Content

Table: Tag
Columns: TagID, Title

Table: ItemTag
Columns: ItemID, TagID

32
এটি "টক্সি" সমাধান হিসাবে পরিচিত, আপনি এটি সম্পর্কে অতিরিক্ত তথ্য এখানে পেতে পারেন: হাওটো.ফিলিপেল্লার.com
দ্য পিক্সেল বিকাশকারী

16
এখানে একটি জিনিস দেখানো হয়নি তা হায়ারার্কাল "ট্যাগ" বা ট্যাগ সারণির বিভাগসমূহ। বিভাগ এবং উপশ্রেণীশ্রেণীযুক্ত সাইটগুলিতে এটি সাধারণত প্রয়োজন হয় তবে ট্যাগিংয়ের নমনীয়তা প্রয়োজন। উদাহরণস্বরূপ, রেসিপি সাইটগুলি, অটো পার্টস সাইটগুলি, ব্যবসায়ের ডিরেক্টরিগুলি ইত্যাদি These এই ধরণের ডেটা সাধারণত একটি একক বিভাগের সাথে খাপ খায় না তাই ট্যাগিংয়ের উত্তর হ'ল আপনাকে নেস্টেড সেট মডেল বা অ্যাজ্যাসেন্সি লিস্ট মডেলের মতো কিছু ব্যবহার করতে হবে need আপনার ট্যাগ টেবিল।
এইচকে 1

5
আমি এইচকে 1 এর সাথে একমত, এটি কি উপরের কাঠামোর সাথে সম্ভব + টেবিল: ট্যাগগ্রুপ কলাম: ট্যাগগ্রুপআইড, শিরোনাম সারণি: ট্যাগ কলাম: ট্যাগআইডিডি, শিরোনাম, ট্যাগগ্রুপআইডি
থান্ডার

আমি যখন টেবিলটিতে CSS কলাম যুক্ত করতে চাই, তখন আমি ট্যাগ টেবিলটিতে CSS কলাম যুক্ত করব?
অমিতাভ

10
@ ফাইভস: লিঙ্কটি আবার ভাঙা হয়েছে, নতুন লিঙ্কটি হ্যাটো.ফিলিপেল্লার.com
2005/

83

সাধারণত আমি ইয়াকভ এলিসের সাথে একমত হব তবে এই বিশেষ ক্ষেত্রে আরও একটি কার্যকর সমাধান আছে:

দুটি টেবিল ব্যবহার করুন:

Table: Item
Columns: ItemID, Title, Content
Indexes: ItemID

Table: Tag
Columns: ItemID, Title
Indexes: ItemId, Title

এর কিছু বড় সুবিধা রয়েছে:

প্রথমে এটি উন্নয়নকে আরও সহজ করে তোলে: সন্নিবেশ করানো এবং আপডেট করার জন্য ত্রি-সারণির সমাধানে itemআপনাকে Tagইতিমধ্যে এন্ট্রি রয়েছে কিনা তা দেখতে টেবিলটি দেখতে হবে। তারপরে আপনাকে তাদের সাথে নতুনদের সাথে যোগ দিতে হবে। এটি কোনও তুচ্ছ কাজ নয়।

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

একটি আইটেমের জন্য সমস্ত ট্যাগ:

3-টেবিল:

SELECT Tag.Title 
  FROM Tag 
  JOIN ItemTag ON Tag.TagID = ItemTag.TagID
 WHERE ItemTag.ItemID = :id

2-টেবিল:

SELECT Tag.Title
FROM Tag
WHERE Tag.ItemID = :id

ট্যাগ-মেঘ:

3-টেবিল:

SELECT Tag.Title, count(*)
  FROM Tag
  JOIN ItemTag ON Tag.TagID = ItemTag.TagID
 GROUP BY Tag.Title

2-টেবিল:

SELECT Tag.Title, count(*)
  FROM Tag
 GROUP BY Tag.Title

একটি ট্যাগের আইটেম:

3-টেবিল:

SELECT Item.*
  FROM Item
  JOIN ItemTag ON Item.ItemID = ItemTag.ItemID
  JOIN Tag ON ItemTag.TagID = Tag.TagID
 WHERE Tag.Title = :title

2-টেবিল:

SELECT Item.*
  FROM Item
  JOIN Tag ON Item.ItemID = Tag.ItemID
 WHERE Tag.Title = :title

তবে কিছু ত্রুটিগুলিও রয়েছে: এটি ডাটাবেসে আরও বেশি জায়গা নিতে পারে (এটি আরও ডিস্ক অপারেশনগুলিকে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে চলতে পারে)

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

অসামঞ্জস্যতার যুক্তিটিও কিছুটা মিট। ট্যাগগুলি নিখরচায় পাঠ্য ক্ষেত্র এবং 'foo' থেকে "ট্যাগ" সমস্ত ট্যাগের নতুন নামকরণের মতো কোনও প্রত্যাশিত ক্রিয়াকলাপ নেই।

সুতরাং tldr: আমি দ্বি টেবিল সমাধানের জন্য যেতে হবে। (আসলে আমি যাচ্ছি। এর বিরুদ্ধে বৈধ যুক্তি আছে কিনা তা দেখতে এই নিবন্ধটি পেয়েছি।)


"সূচক: আইটেমআইডি, শিরোনাম" এর অর্থ প্রতিটি বা একটি সূচক উভয়ই জন্য একটি সূচক বোঝায়?
ড্যানমান

সাধারণত দুটি সূচক। আপনি যে ডাটাবেসটি ব্যবহার করছেন তার উপর নির্ভর করতে পারে।
স্কিনটড

1
ট্যাগ সারণিতে আইটেম আইডি এবং একটি যৌগিক কী ট্যাগ করা হয়? নাকি আপনারও পিকে আছে?
রিপ্পো

2
এইভাবে আপনি "অব্যবহৃত" ট্যাগ তৈরি করতে পারবেন না তাই আইটেমটিতে "অ্যাড ট্যাগ" বৈশিষ্ট্যটি সম্পাদন করতে হবে। অন্য পদ্ধতিতে, "অ্যাড ট্যাগ" বৈশিষ্ট্যটি স্বাধীনভাবে সম্পাদন করা যেতে পারে
জিয়ানলুকা ঘেটিনি

1
@Quilang। আমি এখনও বিশ্বাস করি এটি নির্ভর করে আপনি কী করছেন :) আমি এটি বিভিন্ন প্রকল্পে উভয় উপায়ে প্রয়োগ করেছি। আমার শেষটিতে আমি একটি 3 টি টেবিল সমাধান দিয়ে শেষ করেছি কারণ আমার "ট্যাগ-টাইপ" (বা ট্যাগের কোনও অন্য মেটা তথ্য) দরকার ছিল এবং ট্যাগগুলির একটি নিকটতম চাচাত ভাইয়ের কাছ থেকে কিছু কোড পুনরায় ব্যবহার করতে পারতাম। তবে খুব একই প্রকল্পে আমি আরও কাছের চাচাত ভাইয়ের জন্য ঠিক এই পদ্ধতিটি ব্যবহার করেছি: পতাকাগুলি (উদাঃ 'বিক্রি', 'নতুন', 'গরম')
স্কিনটড

38

আপনি যদি এমন কোনও ডেটাবেস ব্যবহার করছেন যা মানচিত্র-হ্রাসকে সমর্থন করে যেমন কাউচডিবি, প্লেইন পাঠ্য ক্ষেত্র বা তালিকার ক্ষেত্রের মধ্যে ট্যাগ সঞ্চয় করা সত্যই সর্বোত্তম উপায়। উদাহরণ:

tagcloud: {
  map: function(doc){ 
    for(tag in doc.tags){ 
      emit(doc.tags[tag],1) 
    }
  }
  reduce: function(keys,values){
    return values.length
  }
}

এটিকে গ্রুপ = সত্যের সাথে চালানো ফলাফলের নাম অনুসারে গোষ্ঠী করবে এবং এমনকি ট্যাগটির সংখ্যার সংখ্যা গণনা করে return এটি পাঠ্যের কোনও শব্দের ঘটনা গণনা করার মতো ।


4
+1 কিছু নোএসকিউএল বাস্তবায়ন দেখে ভাল লাগছে।
জিওনক্রস

@ নিকরেটাল্যাক লিঙ্কটি কাজ করছে না। আপনি যদি পারতেন তবে দয়া করে এই উত্তরটি আপডেট করুন।
xralf

ঠিক আছে, আমি লিঙ্কটি সংরক্ষণাগার.অর্গ-এর সাথে স্থান দিয়েছি
নিক রেটাল্যাক

13

ট্যাগগুলি সংরক্ষণের জন্য একক বিন্যাসিত পাঠ্য কলাম [1] ব্যবহার করুন এবং এটি সূচী করতে একটি সক্ষম পূর্ণ পাঠ্য অনুসন্ধান ইঞ্জিন ব্যবহার করুন। অন্যথায় আপনি বুলিয়ান কোয়েরিগুলি বাস্তবায়নের চেষ্টা করার সময় স্কেলিংয়ের সমস্যায় পড়বেন।

আপনার যে ট্যাগগুলির সম্পর্কে আপনার যদি প্রয়োজন হয় তবে আপনি এটি বর্ধিত রক্ষণাবেক্ষণের টেবিলে রাখতে পারেন বা তথ্য বের করার জন্য একটি ব্যাচের কাজ চালাতে পারেন।

[1] কিছু আরডিবিএমএস এমনকি এমন একটি দেশীয় অ্যারে প্রকার সরবরাহ করে যা পার্সিং পদক্ষেপের প্রয়োজন না হয়ে স্টোরেজের জন্য আরও ভাল উপযুক্ত হতে পারে তবে পুরো পাঠ্য অনুসন্ধানে সমস্যা দেখা দিতে পারে।


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

স্পিনক্স - sphinxsearch.com
রোমান

যারা এই রুটে যাচ্ছেন তাদের জন্য এই 3-অংশের টিউটোরিয়াল সম্ভবত কার্যকর (সম্পূর্ণ পাঠ্য অনুসন্ধান)। : এটা পোস্টগ্রি নেটিভ সুবিধা ব্যবহার করছে shisaa.jp/postset/postgresql-full-text-search-part-1.html
উইল

পারফরম্যান্সের দিক থেকে এটি কি নির্বাচিত উত্তরের চেয়ে ভাল?

ভারচার 255, কমা বিচ্ছিন্ন ট্যাগ ব্যবহার এবং এটিতে কেফুল টেক্সট সূচক যুক্ত করার জন্য কীভাবে?

9

আমি ট্যাগগুলি সর্বদা আলাদা টেবিলে রেখেছি এবং তার পরে একটি ম্যাপিং টেবিল রেখেছি। অবশ্যই আমি কখনও সত্যিই বড় আকারে কিছুই করি নি।

একটি "ট্যাগ" টেবিল এবং একটি মানচিত্রের টেবিল থাকা ট্যাগ মেঘ উত্পাদন করা বেশ তুচ্ছ করে তোলে এবং যেমন আপনি প্রতিটি ট্যাগ কতবার ব্যবহৃত হয় তার পরিসংখ্যান সহ ট্যাগগুলির একটি তালিকা পেতে সহজেই এসকিউএল একসাথে রাখতে পারেন।


6
এই যদি আপনি একটি ম্যাপিং টেবিল ব্যবহার করবেন না আরও বেশি সহজ :)
Scheintod

0

আমি নিম্নলিখিত নকশার পরামর্শ দেব: আইটেম টেবিল: আইটেমিড, ট্যাগলিস্ট 1, ট্যাগলিস্ট 2
এটি দ্রুত হবে এবং আইটেম স্তরে ডেটা সংরক্ষণ এবং পুনরুদ্ধার সহজ করে তুলবে।

সমান্তরালভাবে অন্য টেবিলটি তৈরি করুন: ট্যাগগুলি ট্যাগ ট্যাগটিকে অনন্য শনাক্তকারী করে না এবং যদি আপনি ২ য় কলামে স্থানের বাইরে চলে যান তবে 100 আইটেমগুলিকে আরও একটি সারি তৈরি করতে দেয়।

এখন কোনও ট্যাগের জন্য আইটেম সন্ধান করার সময় এটি সুপার দ্রুত হবে।


en.wikedia.org/wiki/ প্রথম_ সাধারণ_ফর্ম যদিও এর ব্যতিক্রম রয়েছে, আপনি অস্বীকার করতে পারেন, তবে এখানে নয়
ধীরাজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.