لنفترض أنني أريد إنشاء نظام تدوين مبسط ووضع وسوم لكل تدوينة ماهي الطريقة المثلى؟ هل أستخدم حقل TEXT ومن ثم تقسيم الوسوم بالفواصل مثلا لتصبح الحقول csv؟ ألن يؤثر ذلك على سرعة البحث؟
أنا أستخدم MySQL ولغة PHP
ما افضل استخدامه في قاعدة البيانات هو
بما ان التدوينة الواحدة يمكن ان يكون لها اكثر من وسم ، والوسم الواحد يمكن ان يكون لاكثر من تدوينه ولكن لا يمكن للتدوينة ان تحتوي على نفس الوسم لاكثر من مرة
فانني استخدام جدول للتدوينات
واستخدام جدول للاوسمة
واستخدام جدول للاوسمة وعلاقتها بالتدوينات وليكون اسمه blogsvstags بحيث تكون الرابطة بينهما m <=> m
بحيث لو فرضنا ان جدول التدوينات يحتوي على blog_id وجدول الاوسمة يحتوي على tag_name فيكون جدول التدوينات وعلاقتها بالاوسمة هو
blogtag_blogid و blogtag_tagname
وتكون تلك الحقول مجتمعة عبارة عن foreign key للحقول الاصلية لها في الجداول السابقة وبكل تاكيد
وبالتالي عند البحث عن اوسمة التدوينة رقم واحد تكون العبارة
select blogtag_tagname from blogsvstags where blogtag_blogid = 1;
هذا بالنسبة للقواعد ، ولكل منا طريقته
لنفترض أنني إتبعت طريقتك لكن حين يكون للموضوع الواحد أكثر من وسم، كيف سأقوم بالإشارة إلى هذه الوسوم من جدول التدوينات؟
على إفتراض وجود حقل رقمي للوسم يشير إلى id الخاصة بالوسم في جدول الوسوم فمعنى ذلك أنني قد لاأستطيع إستخدام أكثر من وسم؟
ماهو نوع الحقل الذي أقوم بخزن الإشارة إلى الوسوم فيه؟ أظن في هذه الحالة سيكون نصي مع وضع فواصل بين كل رقم ورقم.
أفضل أن أضع حقل في الجدول باسم Tags وكل تدوينة لها Tags خاص بها يفصل بينهم الفاصلة ","
لكي تقوم بالبحث عن التدوينات التي تحتوي وسم معين, من خلال LINQ في ASP.NET يمكنني القول
list lst = db.blog.where(x=>x.blogTags.Contains("tag")).tolist();
,, السبب في ذلك يعود الى رغبتي في الحصول على أداء سريع في جلب البيانات, فبدل من إستخدام جدولين أقوم بإستخدام جدول واحد فقط !
قد تكون طريقتك صحيحه الى حد ما! وهذه الطريقة كنت استخدمها في الجامعة ومرة جاني دكتور عراقي الله يذكره بالخير وقالي مقولة الى الان بتبعها وهي عند كتابة حقول جدول في قاعدة البيانات وان كانت هناك حقول بينها علاقات في اكثر من جدول فان استطعت ان تخرج تلك الحقول خارج الجدولين بجدول منفصل وتشير اليه ب foreign key يكون افضل.
وفي مثالك هذا لو افرضنا ان ال tag هي عباراة عن اوسمة ثابتة وموجودة في جدول خاص فيها ، وقام مدير النظام على حذف الوسم "تقنية" ، فما فائدة ان يبقى كلمة "تقنية" في وسوم المقالات؟ فالوسم الاصلي تم حذفه. وان كنا نتعامل مع نظام نشط فمع مرور الوقت سوف تحتوي قاعدة البيانات على بيانات لا نرغب بها ولا فائدة منها.
كما ان فصل الحقول المتاشبهة في الجداول بجدول منفصل يقلل من تكرار البيانات
على فكرة نسيت ان اقول، صحيح ان استخدام جدول واحد اسهل على المبرمج في جلب البيانات في بداية عمر المشروع ولكنه في البيئات التي تكثر فيها العلاقات اصعب على نظام قواعد البيانات خصوصا اثناء تنفيذ عمليات البحث.
فالاولى برايي ان نتبع الطريقة الاصعب على المبرمج والاسهل على النظام ، لان المبرمج يبرمج مرة واحد اما النظام فهو يتعامل يوميا مع الاف الطلبات.
حسنا اخي يبدو ان هناك بعض الإشكالات التي أرغب منك بتوضيحها لي لاني التمست بعض التناقضات في ردودك وسأبدأ بسردها
أولا فصل الحقول المتشابهه يقلل من تكرار البيانات : مقولة صحيحة ولكن لا أرى أنها تنطبق على السيناريو المطروح ! فماذا ستفعل اذا كان هناك نفس الوسم لتدوينتين مختلفتين ؟
يمكنك حذف وتعديل وسم معين عند وضعك لحقل في جدول التدوينة ولا أعتبر وجود تلك النقطة ميزة
تدعي يا صديقي أن بناء جدول للوسوم وجدول للتدوينات هو الطريقة الأصعب للمبرمج وأنا أرى العكس تماما, فهل تعتقد أنه من الصعب بناء جدولين وربطهما مع بعض !!! ثم إن من الصعب أن تتعامل مع الوسوم وهي موجوده في حقل ضمن جدول التدوينات على العكس من التعامل معها عند وجودها بجدول منفصل. الجدول المنفصل أسهل بكثير.
لم تأت أبدا على ذكر الفرق في السرعة والأداء بين الطريقتين بل أكتفيت بالقول ان الأمر أسهل على المبرمج ولا أعلم لماذا ! ثم إن النظام الذي يتعامل يوميا مع الاف الطلبات بالتأكيد سيكون بحاجة لتنظيم أكثر ومراعاة أبسط الأشياء عند كتابته, فبدلا من الاستعلام مرتين لكل تدوينة يمكنك الإستعلام مرة واحده
شكرا لك
فصل الحقول المتشابهه يقلل من تكرار البيانات
لك كان لدينا 1000 مقال
و 20 وسم
وكنت تستخدم حقل للوسوم في المقال، حيث انك كنت تستخدم الفاصلة بين الوسوم ، وقرر مدير النظام ان يحذف وسم من الاوسمة في جميع المقالات ماذا ستفعل؟
تدعي يا صديقي أن بناء جدول للوسوم وجدول للتدوينات هو الطريقة الأصعب للمبرمج وأنا أرى العكس تماما
وجهة نظر ولكل وجهة نظرة
لم تأت أبدا على ذكر الفرق في السرعة والأداء
سقط سوا، وبكل تاكيد الفصل بين الجداول واستخدام foreign key يكون اداءة اسرع وصيانته اسهل.
انت ذكرت: "فبدلا من الاستعلام مرتين لكل تدوينة يمكنك الإستعلام مرة واحده"
هذا لو كان الاستعلام يتم بدلالة رقم المقال
بينما لو كان الاستلام يتم بدلالة الوسم ، فكيف سوف تفعل اذا كان حقل الوسم مجرد حقل في جدول المقالات؟
ماذا لو كانت عبارة الاستعلام بدلات وسمين ونفي وسم اخر ، بمعنى اظهر لي المقالات التي تتبع للوسم تقنية والوسم جوجل ولكنها لا تتبع للوسم تويتر؟ هنا اعتقد ان فصل الجداول سوف يكون حل امثل
وبالنهاية فان لكل مبرمج طريقة ، وما ينفذة فلان بطريقة معينة يستطيع شخص احر تنفيذة بمئة طريقة مختلفة اخرى والنتيجة تكون واحدة للجميع.
بينما لو كان الاستلام يتم بدلالة الوسم ، فكيف سوف تفعل اذا كان حقل الوسم مجرد حقل في جدول المقالات؟
أرى أنك لم تقرأ الرد الأصلي لي على الموضوع فقد وضحت ذلك
وأعتقد أيضا انك تريد الجدال لا النقاش وهذا ما هو واضح من ردودك وخصوصا هنا.
سقط سوا، وبكل تاكيد الفصل بين الجداول واستخدام foreign key يكون اداءة اسرع وصيانته اسهل.
لذلك أعتذر عن متابعة النقاش معك هنا, :)
التعليقات