arashdanger
Member
سلام امروز یه سئوال خفن دارم:
فرض کنیم میخواهیم سیستم مسنجر یاهو رو با دیتابیس mysql پیاده کنیم(همون کاری که یاهو کرده) میخواهیم که هر نفر بتونه به مقدار دلخواه دوست به لیستش اضافه کنه(add to friend list) خب برای مثال یه table داریم به نام users که یه همچین شکلی داره:
خب این یک حالت ممکنه که اسم دوستان کاربر رو همشو تو یه خانه بریزیم و وسطشون یه ویرگولی چیزی بزاریم که از هم جدا بشن.یه راه دیگه هم هست که مثلا 100 تا ستون به نامهای friend1,friend2,... در نظر بگیریم و بیشتر از این تعداد اجازه ندیم کاربر کسی رو به لیست دوستاش اضافه کنه.راه سوم هم اینه که هر بار که کاربر یه دوست به لیستش اضافه کرد به table یه ستون اضافه کنیم.
اشکالات:
اشکال راه اول اینه که این پیاده سازی کلی بار روی سرور میزاره و هربار که بخواهیم لیست دوستان رو بخونیم باید یه متن رو تکه تکه کنیم و ... حالا فکر کنید اگر بخواهیم ببینیم که مثلا arashdanger دوست چه کسایی هست چقدر طول میکشه به نتیجه برسیم!!!(این بدترین روش بود)
روش دوم ار لحاظ سرعت خیلی خوبه ولی دوتا اشکال داره اول اینکه کاربر بیشتر از مثلا 100 تا نمیتونه دوست توی لیستش داشته باشه و اشکال دوم اینه که احتمالا خیلی از کاربرها همین 100 تا دوست رو هم ندارن و ما با کلی خانه خالی موجه میشیم که زیاد قشنگ نیست و ممکنه اشکالات ثانویه هم بوجود بیاره.
روش سوم رو هم یکی از دوستانم پیشنهاد کرد که همون اشکال خالی موندن خانه هارو داره و اینکه نمیدونم که آیا تو mysql میشه یک ستون به table اضافه کرد یا نه و اگر امکانش هست اینکار چطور انجام میشه و آیا از کل دیتابیس backup میگره و یه ستون اضافه میکنه و دوباره اطلاعات رو توش میریزه یا طور دیگه ای عمل میکنه؟
خب به نظرتون Yahoo چه طور این مشکل رو حل کرده؟ چون هیچکدوم از راه حلهایی که گفتم به درد نمیخورن!!!
(این ID هایی که تو table نوشتم از خودم در آوردم! همونطور هم که میبینین بعضیا مثل خودم خودشون روهم add میکنن که هیچوقت تو یاهو تنها نباشن!!!)
فرض کنیم میخواهیم سیستم مسنجر یاهو رو با دیتابیس mysql پیاده کنیم(همون کاری که یاهو کرده) میخواهیم که هر نفر بتونه به مقدار دلخواه دوست به لیستش اضافه کنه(add to friend list) خب برای مثال یه table داریم به نام users که یه همچین شکلی داره:
کد:
# # Table structure for table `users` #
CREATE TABLE users ( id int(11) NOT NULL auto_increment, username varchar(255) NOT NULL default '', name varchar(255) NOT NULL default '', city varchar(255) NOT NULL default '', friends text NOT NULL, PRIMARY KEY (id), FULLTEXT KEY friends (friends) ) TYPE=MyISAM;
# # Dumping data for table `test` #
INSERT INTO test VALUES (1, 'arashdanger', 'arash', 'tabriz', 'ali_khafan,ahmad_delon,arashdanger');
INSERT INTO test VALUES (2, 'ali_khafan', 'ali', 'tehran', 'arashdanger,ahmad_delon'); INSERT INTO test VALUES (3, 'ahmad_delon', 'ahmad', 'shiraz', 'ali_khafan,nasim_2000');
INSERT INTO test VALUES (4, 'nasim_2000', 'ghanbar', 'tehran', '');
خب این یک حالت ممکنه که اسم دوستان کاربر رو همشو تو یه خانه بریزیم و وسطشون یه ویرگولی چیزی بزاریم که از هم جدا بشن.یه راه دیگه هم هست که مثلا 100 تا ستون به نامهای friend1,friend2,... در نظر بگیریم و بیشتر از این تعداد اجازه ندیم کاربر کسی رو به لیست دوستاش اضافه کنه.راه سوم هم اینه که هر بار که کاربر یه دوست به لیستش اضافه کرد به table یه ستون اضافه کنیم.
اشکالات:
اشکال راه اول اینه که این پیاده سازی کلی بار روی سرور میزاره و هربار که بخواهیم لیست دوستان رو بخونیم باید یه متن رو تکه تکه کنیم و ... حالا فکر کنید اگر بخواهیم ببینیم که مثلا arashdanger دوست چه کسایی هست چقدر طول میکشه به نتیجه برسیم!!!(این بدترین روش بود)
روش دوم ار لحاظ سرعت خیلی خوبه ولی دوتا اشکال داره اول اینکه کاربر بیشتر از مثلا 100 تا نمیتونه دوست توی لیستش داشته باشه و اشکال دوم اینه که احتمالا خیلی از کاربرها همین 100 تا دوست رو هم ندارن و ما با کلی خانه خالی موجه میشیم که زیاد قشنگ نیست و ممکنه اشکالات ثانویه هم بوجود بیاره.
روش سوم رو هم یکی از دوستانم پیشنهاد کرد که همون اشکال خالی موندن خانه هارو داره و اینکه نمیدونم که آیا تو mysql میشه یک ستون به table اضافه کرد یا نه و اگر امکانش هست اینکار چطور انجام میشه و آیا از کل دیتابیس backup میگره و یه ستون اضافه میکنه و دوباره اطلاعات رو توش میریزه یا طور دیگه ای عمل میکنه؟
خب به نظرتون Yahoo چه طور این مشکل رو حل کرده؟ چون هیچکدوم از راه حلهایی که گفتم به درد نمیخورن!!!
(این ID هایی که تو table نوشتم از خودم در آوردم! همونطور هم که میبینین بعضیا مثل خودم خودشون روهم add میکنن که هیچوقت تو یاهو تنها نباشن!!!)