PDA

View Full Version : طراحی دیتابیس سیستم کامنت گذاری سایت



Hamid2547
یک شنبه 13 فروردین 1391, 21:13 عصر
قصد من طراحی دیتابیس برای یک سایت خبری هست ولی یکی از بخش های اون من رو گیج کرده و واقعا نمیدونم کار درست براش چی هست و روش های زیادی رو دیدم ولی حتی اگر بخام به کار ببندمشون هم نمیدونم چطور براشون کوئری بنویسم یا چطور اینسرت کنم داستان دیتابیس از این قراره:
چهار تا انتیتی هست به نام های News و BlogPost و Picture و Video این چهار بخش میتونند پست های خاص خودشون رو داشته باشند و جدول خاص خودشون رو دارند، حالا برای این هر پست از این تیبل ها میخام سیستم کامنت گذاری طراحی کنم و برای انجام اینکار چند تا راه دارم، راه اول که ساده ترین هم به نظر میرسه اینه که به ازای هر انتیتی یه جدول هم برای کامنت درست کنم که مشکلش به نظر میرسه این باشه که هر تیبل آیدی خاص خودش رو میگیره و به اضای هر کامنت یه آیدی خاص ندارم و اگر بخام به طور مثال تمام کامنت های یک یوزر رو کوئری کنم نمیدونم باید چطوری این کار رو انجام بدم:
http://up98.org/upload/server1/02/g/qksrosvclq95da2by3w1.jpg
روش دوم قرار دادن یه جدول واسطه هست هست که به جای اینکه هر جدول کامنت خودش ایدی داشته باشه اون جدول واسطه یه ایدی داشته باشه و به تمام جدول های کامنت فارین کی دادن بشه ولی مشکلی اینه من نمیدونم چطور باید اطلاعات رو اینسرت کنم چون تا ایدی توی جدول واسطه وجود نداشته باشه نمیتونم اون جدول کامنت چیزی اینسرت کنم:
http://up98.org/upload/server1/02/g/4iv6ll0dncs8fengnu9f.jpg
روش سوم که از اینجا (http://stackoverflow.com/questions/668921/foreign-key-refering-to-primary-keys-across-multiple-tables) نمونشو دیدم اینه که یه جدول به نام Post به عنوان SuperType درست کنم و جدول های News ,BlogPost,Picture ,Video رو به عنوان SubType در نظر بگیرم که باز هم برای اینسرت کردن توی اینطور سیستمی مشکل دارم، و رابطه هایی که باید براش در بیارم منو گیج میکنه و محدودیت هایی که باید روی جدول های ساب تایپ گذاشته بشه تا ایدی های تکراری نگیره:
http://up98.org/upload/server1/02/g/8gkq720iu5uffq33wo6.jpg
به نظر شما کودوم راه حل بهترین راه حل هست و مثلا اگر خواستم از روش دوم استفاده کنم چطور قراره کوئری برای اینسرتش بنویسم با توجه به اینکه من در این زمینه مبتدی و کم تجربه هستم.

kobari
پنج شنبه 07 اردیبهشت 1391, 01:08 صبح
نميشه اين كارها را با يك جدول كه با يك فيلد comment_id انواع كامنت ها را از هم تفكيك كنه انجام داد؟ مثلآ 1 براي news و 2 براي video و 3 براي picture و 4 براي blogspot
نام يوزر و كامنت و تاريخ و فيلدهاي ديگر را هم تو همين جدول گذاشت؟

Hamid2547
پنج شنبه 07 اردیبهشت 1391, 19:10 عصر
نميشه اين كارها را با يك جدول كه با يك فيلد comment_id انواع كامنت ها را از هم تفكيك كنه انجام داد؟ مثلآ 1 براي news و 2 براي video و 3 براي picture و 4 براي blogspot
نام يوزر و كامنت و تاريخ و فيلدهاي ديگر را هم تو همين جدول گذاشت؟
مشکل اینه بعدش که میخام بگیم که این کامنت مربوط به کدام آیدی از خبر یا عکس و... هست باید چهار تا فیلد توی اون جدول اضافه کنیم و توی هر اینسرت یکی از اونها رو خالی بذاریم،یا اینکه همه ی آیدی ها رو بدیم به یک فیلد که در این صورت هم ارتباط چند به چند به وجود میاد و همه چیز غلط میشه، در حال حاضر من همین کارو کردم ولی بیشتر برای راحتی کار بوده و استاندارد نیست و میشه اطلاعات غلط وارد کرد، یه جدول کامنت و یه کامنت تایپ و یه ایدی که به تمام اون چهار تا انتیتی قراره آیدی بده ولی کانسترینت روشون نذاشتم و باید خودم حواسم بهشون باشه.

mosyhey
پنج شنبه 07 اردیبهشت 1391, 19:50 عصر
شما می توانید یک جدول بسازید برای دیدگاه ها. یک فیلد که ID خود دیدگاه است. یکی هم مثلا با نام MENU باشد برای رسته ای که دیدگاه از آنجا فرستاده شده و یکی هم NID یعنی ID آن خبر در آن رسته. بقیه فیلد ها هم بسته به نیاز بگذارید مثلاً متن دیدگاه، نام و ایمیل دیدگاه گذار، تاریخ و زمان و ....


id menu nid name email comment ...
----------------------------------------------------------------------
1 video 5 reza e@s.ir salam. ...
2 news 3 hasan a@a.ir chera? ...
3 blog 5 taghi h@h.ir bale. ....
...

Hamid2547
جمعه 08 اردیبهشت 1391, 08:54 صبح
شما می توانید یک جدول بسازید برای دیدگاه ها. یک فیلد که ID خود دیدگاه است. یکی هم مثلا با نام MENU باشد برای رسته ای که دیدگاه از آنجا فرستاده شده و یکی هم NID یعنی ID آن خبر در آن رسته. بقیه فیلد ها هم بسته به نیاز بگذارید مثلاً متن دیدگاه، نام و ایمیل دیدگاه گذار، تاریخ و زمان و ....


id menu nid name email comment ...
----------------------------------------------------------------------
1 video 5 reza e@s.ir salam. ...
2 news 3 hasan a@a.ir chera? ...
3 blog 5 taghi h@h.ir bale. ....
...
من الان تقریبا همین کار رو انجام دادم، ولی نرمال نیست این روش، مشکل بر سر nid هست، nid باید چک کنه توی اون جدول ها تا ببینه کامنتی داده نشه که مربوط به پستی باشه که توی اون چهار جدول نیوز و... وجود نداشته باشه، اگر بخایم فارین کی کانسترینت برای این موضوع از آیدی اون چهار تا جدول بدیم بهش چی تضمین میکنه که آیدی اشتباه وارد نشه؟ مثلا آیدی شماره ی شیش رو برای ویدئو توی جدول کامنت وارد کردیم و دیتابیس میره چک میکنه ببینه آیدی شماره ی شیش وجود داره توی اون جدول ها یا نه، اگر آیدی شماره ی شیش توی یکی از جدول ها باشه دیتابیس دیگه ایراد نمیگیره در حالی که باید برای هر چهار تای اون جدول ها چک کنه چون اگر فقط برای یکی چک کنه شاید اون جدول مورد نظر ما نباشه، اگر از جنبه ی دیگه هم بخایم حساب کنیم بر فرض که بخاد برای اون چهار تا چک کنه مشکل اینه که یه آیدی دادیم توی جدول کامنت که بچه ی آیدی جدول نیوز هست، دیتابیس میره چهار تای جدول ها رو چک میکنه و ایراد میگیره که چرا توی بقیه ی جدول ها نیست این آیدی و فقط توی یکیش هست، این دو سناریویی هست که اگر بخایم فارین کی بدیم ممکنه اتفاق بیوفته، مگر اینکه اصلا کانسترینت ایجاد نکنیم و خودمون به صورت دستی حواسمون باشه به این موضوع که من همین کارو کردم، ولی نمیدونم کار درستی باشه یا نه.