13

ماهو الاسلوب الذى تتبعه لتقوم بعمل تعديل لموضوع يرتبط بجدول tags ؟؟

هناك مشكلة تواجهنى دائماً فى عمل جدول قاعدة بيانات من أجل الـ tags و المشكلة التى تواجهنى هى فى عملية تحديث التاجز

بفرض أنك لديك مقاله و موضوع لها 20 تاج

لديك جدول topics و جدول tags و يحتوى الأخير على row لكل tag

----------------------------------------
topic_id | topic_title
----------------------------------------
1    | title 1
2    | title 2
----------------------------------------



----------------------------------------
tag_id | tag_topic_id | tag_text
----------------------------------------
1      | 1        | tag_1
2      | 1        | tag_2
3      | 1        | tag_3
4      | 2        | tag_4
5      | 2        | tag_5
----------------------------------------

عند عمل edit لل topic هل تقوم بعمل 20 إستعلام فى قاعدة البيانات لتعمل check على كل تاج هل هو جديد , هل هو محذوف ؟

الطريقة التى أعمل بها هى حذف الكلمات الدلالية الحالية كلها و إضافة الجديده Delete_all_tags_for_topic(x) insert_tags_for_topic(x,tags)

ولكن ذلك يؤثر على ال خانة ال tag_id حيث لا يكون ال auto_increment الخاص بها به ارقام مفقوده كثيرة

كما أضطر فى غالب الأمر إلى وضع حد أقصى من الكلمات الدلالية

يرجى الدخول لحسابك أو تسجيل حساب لتستطيع إضافة تعليق
حساب جديد دخول

التعليقات

13

أقترح عمل ثلاث جداول ..

TOPIC : topic_id, topic_title

TAG: tag_id, tag_text

T_TAGS: topic_id, tag_id

بحيث عند تعديل التاجز يمكنك ببساطة حذف كل التاجز المتعلقة بالـ topic

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

13

ملحوظة، ردي سيكون مختصر لنوعية tags لمواضيع شبيهه بموقعك notedn.com، بحيث كل موضوع له مجموعة أوسمة فريدة و تختلف من موضوع لآخر، و قد لا تكون لها أي ارتباط ببعضها البعض.

سيكون حلّي أولا بحذف tag_id من الجدول الثاني. سيكون key للجدول الثاني مكوّن من خانتين tag_text و tag_topic_id و index على عمود tag_topic_id .

في مثل هذه الحالة، لو قام شخص بالتعديل على الموضوع، سأقوم بالتالي

  1. الاستعلام عن جميع أوسمة الموضوع (فرضا رقم الموضوع 1)

    SELECT tag_text from tags where tag_topic_id=1

و سأحفظ القيمة المستجرعة في متغير كمصفوفة، مثلا اسم المتغير old_tags

  1. و من طلب HTTP، سأستخرج القيم الجديدة للأوسمة و أحفظها في متغير اسمه new_tags

  2. الأوسمة التي سأضيفها للجدول الثاني هي الأوسمة الموجودة في new_tags و الغير موجودة في old_tags

  3. الأوسمة التي سأقوم بحذفها من الجدول الثاني هي الأوسمة الموجودة في old_tags و الغير موجودة في new_tags

و هذا مثال مبسط باستخدام ruby

irb(main):001:0> old_tags = ['tag_1', 'tag_2', 'tag_3']
["tag_1", "tag_2", "tag_3"]
irb(main):002:0> new_tags = ['tag_1', 'tag_3', 'tag_4']
["tag_1", "tag_3", "tag_4"]
irb(main):003:0> to_delete = old_tags - new_tags
["tag_2"]
irb(main):004:0> to_add = new_tags - old_tags
["tag_4"]

ملحوظة خاصية الطرح في المصفوفات لا تدعمها PHP، ابحث عن البديل أو برمجها أنت.

الآن، لدينا قائمة بالأوسمة الجديدة و الأوسمة التي سنحذفها

if to_delete.size > 0
    delete_tags(topic_id, to_delete)
if to_add.size > 0
    add_tags(topic_id, to_add)

و الدالة delete_tags، ستبدأ باستعتلام حذف فارغ مثل

sql = 'DELETE from tags where'

و ستنشئ for للمرور على كل عناصر to_delete و إضافة "(tag_topic_id = $TOPIC_ID) and tag_text=$TAG ستنتهي بشئ شبيه بـ (في حالة topic id = 1 و عناصر to_delete هي "tag1" و "tag2"

delete from tags where (tag_topic_id=1 AND tag_text="tag1") OR (tag_topic_id=1 AND tag_text="tag2")

أو تستطيع حذف كل وسم على حدة لو أحببت.

و دالة add_tags ستكون شبيه و لكن ستنتهي بشئ مثل: (في حالة topic id = 1 و عناصرto_add هي "tag4" و "tag5"

insert into tags (tag_topic_id, tag_text) values (1, "tag4"), (1, "tag5")

هذه أقصر طريقة في نظري

أضفت لى معلومة جديده و هى أنه يمكن أن يكونه ال primary key مكون من خانتين , فشكراً لك

بالنسبة للطريقة التى طرحتها و عملية طرح مصفوفتين القديمه و الجديده فهى أيضاً رائعه فى ruby and rails ولا أعرف لماذا ليست فى php :(

سأبنى دالة لتقوم بذلك

العفو.

فهى أيضاً رائعه فى ruby and rails

هذه ليست ruby on rails، بل ruby. إطار ruby on rails مليئ بالعجب :). الخاصية موجودة أيضا في python

>>> a = {'tag1','tag2'}
>>> b = {'tag2','tag3'}
>>> a - b
{'tag1'}
>>> b - a
{'tag3'}

و بحثت و وجدت دالة تقوم بالمثل في php و هي: array_diff .

$old_tags = array("tag1", "tag2", "tag3");
$new_tags = array( "tag1", "tag3", "tag4");
$to_delete = array_diff($old_tags, $new_tags);
$to_add = array_diff($new_tags, $old_tags);

print "to delete: ";
print_r($to_delete);

اتمنى ان اكون فهمت مرادك ...انت ستستعلم عن ال tags مرة للعرض بدلالة ال topic_id وتحتفظ بقائمة ال tags القديمة في السيشن او اي طريقة اخرى ....بعد ادخال المستخدم ال submission لعملية التحديث على الواجهة ....تقارن ببن القائمتين القديمة والجديدة وتنفذ مرة للحذف و مرة لحفظ الكلمات المفتاحية الجديدة

هل يمكننا عمل إستعلام واحد فى قاعدة البيانات لوضع القيم بشرط ألا تكون موجوده بنفس القيمة و نفس ال topic_id :)

بإستخدام if بداخل query

أنا اقوم بنفس ما تقوم به .. بحيث اقوم بحذف كل التاغز المرتبطة بالمقالة و اضافتها من جديد ( عند التعديل ) في الحالة التي استخدم بها جدولاً منفصلاً للتاغات .

و لكن لما لا تخزن التاغات في جدول الخبر أو المقالة نفسه ؟

حتى أستخدم التاجز فى عملية البحث عن المقالات المرتبطة بنفس التاج (بسهولة)

يمكنك تخزينها في حقل ضمن الجدول نفسه و البحث عنها أيضاً LIKE or MATCH .. AGAINST.. الاستعلام سيكون ابطأ و أثقل و لكنه سيوفر عليك عناء الـ JOIN او عمل استعلامين .

و هل عمل إستعلام بطئ هو الحل الأمثل ؟

لا اخي عبدالله .. كنت اطرح الطرق و ليس الحلول .

قلت في رد سابق بأنني استخدم طريقتك نفسها في تخزين التاغات .

تحياتي لك .