أوصى قاعدة بيانات SQL تصميم العلامات أو علامات [مغلقة]

StackOverflow https://stackoverflow.com/questions/20856

سؤال

لقد سمعت من عدد قليل من الطرق لتنفيذ علامات;استخدام الخرائط الجدول بين TagID و ItemID (المنطقي بالنسبة لي, لكن هل هذا المقياس؟), إضافة عدد ثابت من الممكن TagID أعمدة ItemID (يبدو مثل فكرة سيئة) ، وحفظ الكلمات في نص عمود هذا مفصولة بفواصل (يبدو جنونا ولكن يمكن أن تعمل).حتى أنني سمعت أحدهم يوصي مصفوفة متفرق ، ولكن بعد ذلك كيف الوسم أسماء تنمو بشكل مناسب ؟

أنا في عداد المفقودين على أفضل الممارسات في مجال العلامات ؟

هل كانت مفيدة؟

المحلول

الجداول الثلاثة (واحد لتخزين جميع البنود, واحد عن كل فئة ، واحد عن العلاقة بين اثنين) ، فهرستها بشكل صحيح ، مع مفاتيح خارجية مجموعة تعمل على السليم قاعدة البيانات ، ينبغي أن تعمل بشكل جيد و الحجم بشكل صحيح.

Table: Item
Columns: ItemID, Title, Content

Table: Tag
Columns: TagID, Title

Table: ItemTag
Columns: ItemID, TagID

نصائح أخرى

عادة أنا أتفق مع يعقوب إليس لكن في هذه الحالة الخاصة هناك حل:

استخدام جدولين:

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

ولكن هناك بعض السلبيات أيضا:يمكن أن تأخذ مساحة أكبر في قاعدة البيانات (التي يمكن أن تؤدي إلى مزيد من عمليات القرص الذي أبطأ) و ليس تطبيع التي يمكن أن تؤدي إلى تناقضات.

حجم الحجة ليست قوية لأن طبيعة جدا من الكلمات هو أنها عادة صغيرة جدا حتى حجم الزيادة ليست كبيرة واحدة.يمكن للمرء أن يجادل بأن الاستعلام عن الوسم العنوان هو أسرع بكثير في طاولة صغيرة التي تحتوي على كل الوسم مرة واحدة فقط و هذا بالتأكيد غير صحيح.ولكن مع الأخذ في الادخار لعدم وجود للانضمام إلى حقيقة أن يمكنك بناء جيد مؤشر عليها يمكن بسهولة تعويض هذا.هذا بالطبع يعتمد بشكل كبير على حجم قاعدة البيانات الذي تستخدمه.

التناقض الحجة قليلا خلافية أيضا.العلامات مجانا حقول النص و ليس هناك من يتوقع العملية مثل 'إعادة تسمية كافة العلامات "فو" إلى "بار"'.

حتى tldr:وأود أن تذهب اثنين طاولة الحل.(في الواقع أنا ذاهبة.لقد وجدت هذا المقال لمعرفة ما إذا كانت هناك حجج صالحة ضد ذلك.)

إذا كنت تستخدم قاعدة البيانات التي تدعم خريطة-تقليل مثل couchdb, تخزين الكلمات في نص عادي الحقل أو قائمة مجال هو في الواقع أفضل طريقة.على سبيل المثال:

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

تشغيل هذا مع مجموعة=true المجموعة النتائج قبل اسم الوسم ، وحتى العودة العد من عدد المرات التي الوسم تمت مصادفة.انها مشابهة جدا عد تكرارات كلمة في النص.

استخدام واحد مهيأ عمود نص[1] لتخزين الكلمات واستخدام قادرة على النص الكامل محرك البحث فهرسة هذا.آخر سيتم تشغيل في زيادة المشاكل عند محاولة تنفيذ منطقية الاستعلامات.

إذا كنت بحاجة إلى التفاصيل عن العلامات لديك ، يمكنك إما تتبع ذلك تدريجيا في الحفاظ على الجدول أو تشغيل مهمة دفعي إلى استخراج المعلومات.

[1] بعض RDBMS حتى توفر مواطن صفيف نوع والتي قد تكون حتى أكثر ملاءمة لتخزين لا تحتاج إلى تحليل الخطوة ، ولكن قد يسبب مشاكل مع البحث عن النص الكامل.

لطالما احتفظت به في جدول منفصل ثم كان تعيين الجدول.بالطبع أنا لم أفعل أي شيء على نطاق واسع أيضا.

وجود "فئة" جدول خريطة الجدول يجعلها تافهة جدا لتوليد علامة الغيوم & مثل هذا حيث يمكنك بسهولة وضع معا SQL للحصول على قائمة من الكلمات الدليلية مع التهم من المرات كل الوسم يستخدم.

أود أن أقترح التصميم التالية :البند الجدول:Itemid, taglist1, taglist2
هذا وسوف تكون سريعة تجعل من السهل حفظ واسترجاع البيانات على مستوى العنصر.

بالتوازي مع بناء آخر الجدول:Tags الوسم لا تجعل الوسم معرف فريد و إذا كنت ينفد من الفضاء في 2 عمود الذي يحتوي على دعونا نقول 100 البنود إنشاء صف آخر.

الآن أثناء البحث عن العناصر علامة سيكون بسرعة فائقة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top