أوصى قاعدة بيانات SQL تصميم العلامات أو علامات [مغلقة]
-
09-06-2019 - |
سؤال
لقد سمعت من عدد قليل من الطرق لتنفيذ علامات;استخدام الخرائط الجدول بين 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 البنود إنشاء صف آخر.
الآن أثناء البحث عن العناصر علامة سيكون بسرعة فائقة.