طراحی دیتابیس برای اعضای سایت

phpweb

Active Member
من مدیران و اعضای سایتم رو توی یه جدول ذخیره می کنم، موقع لاگین کردن، ویرایش پروفایل و ارسال ایمیل برای اعضا و تغییر کلمه رمز از این جدول استفاده می کنم.

تعداد فیلدهای این جدول 32 تا هست و اطلاعاتی مثل کلمه کاربری، رمز، اسم، فامیل، ایمیل، علایق و ... توی جدول ذخیره می شن. ولی از اونجا که بیشتر موقع لاگین کردن از این جدول استفاده می کنم، 5- یا 6 فیلد این جدول زیاد بکار گرفته می شن.

می خوام بدونم که لازمه که طراحی این جدول رو تغییر بدم؟

لطفا توضیح بدید.
 

Domanjiri

Well-Known Member
درود بر شما

اگه که تعداد کاربران شما محدود هست و پیش بینی می کنید که تعدا کاربران مثلن از 1000 تا بیشتر نمیشه، خب همین پیاده سازی مناسب هست (چون کار باهاش راحت تره!)

اما در حالت کلی راه بهتر استفاده از 2 جدول هست (و اگه نیاز باشه تعداد بیشتر، مثلن میشه اطلاعات پروفایل رو دسته بندی کرد و... که برای شبکه های اجتماعی بزرگ هست). داده های اکانت در یک تیبل و داده های پروفایل در تیبل دیگه که با هم رابطه ی یک به یک دارن. سایتی مثل فیس بوک از این معماری (البته طبیعتا بهینه ترش!) استفاده میکنه.

اگه تعداد کاربران کم هست، ولی توی پروفایل مثلن یه قسمت وجود داره به اسم "زندگی نامه"(که حجیم هست)، بازم از روش دوم استفاده کنید

موفق باشید
 

Cyletech

Member
طراجی پایگاه داده یکی از مهم ترین بحش های طراحی نرم افزار هست. طراحی پایگاه داده برای این خوب باید انجام بشه که در نوع درخواستی که ازش میشه به راحتی و با سرعت بالا بتونه پاسخ بده. اولین کار ، انتخاب type ، تعداد کاراکتر مناسب و collection جدول ها هست. اینها رو خوب انتخاب کنید و پیشنهاد می کنم از موتور InnoDB استفاده کنید.
در قدم بعدی باید بدونید اگر اینها رو رعایت کنید ، در حد متوسط به پایین شیوه طراحی آدم بزرگ هارو رعایت کردید. پس نگران نباشید. ولی موردی که باید به ذهن بسپارید اینه که همه چی به درخواست یا کوئریتون داره. مثلاً می گن از بین 70 تا ستون یک جدول میخوای 10 تاشو فرضاً بکشی بیرون ، بجای اینکه از * استفاده کنی ، نام اون جداول رو بنویس که سرعت بدست گیری کوئریتون افزایش پیدا کنه. ...
 

phpweb

Active Member
اگه که تعداد کاربران شما محدود هست و پیش بینی می کنید که تعدا کاربران مثلن از 1000 تا بیشتر نمیشه، خب همین پیاده سازی مناسب هست (چون کار باهاش راحت تره!)
سایتهایی که یه شرکت می خواد، مثل شبکه اجتماعی نیستن که مدام پروفایل اعضا نمایش داده بشن، به همین دلیل تصمیم گرفتم از یه جدول استفاده کنم.

اولین کار ، انتخاب type ، تعداد کاراکتر مناسب و collection جدول ها هست. اینها رو خوب انتخاب کنید و پیشنهاد می کنم از موتور InnoDB استفاده کنید.
تا اونجا که می دونم جدولهای myisam برای رشته های متنی سرعت بیشتری نسبت به InnoDB دارن.

متونی که توی دیتابیس ذخیره می شن بیشتر فارسی و انگلیسی هستن، بنظرتون برای این کار چه collection باید بکار ببرم؟
 
من از utf8_unicode_ci استفاده می کنم، می شه بگید این دو کلکشن چه تفاوتی با هم دارن؟

فرق این دو در سرعت, دقت و نوع تبدیل value ها هست.
utf8_unicode_ci عموما دقیق تر هست و تنها ضعفی که میتونه داشته باشه سرعت کمترش هست.
همینطور utf8_general_ci در بعضی از زبان ها مثل اوکراینی یا ... بعضی از کاراکتر ها رو درست نمایش نمیده.
در کل سرعت فرق چندانی نداره. بهتره از utf8_unicode_ci استفاده کنی.
 

Cyletech

Member
آخه یونی کد که مخفف یونیک کد هیت و نمی تونه به زبان اوکراینی ارتباطی داشته باشه !


می شه بیشتر توضیح بدید؟
utf8_unicode_ci سرعتش یه مقدار کمتر از utf8_general_ci هست. utf8_general_ci یه کلکشن خیلی ساده هست که فقط لهجه ها رو حذف می کنه بعد به حروف بزرگ تبدیل می کنه. مثلاً این حروف لاتین ÀÁÅåāă رو با A برابر می دونه و تبدیل می کنه.
utf8_unicode_ci عموماً برای اسکریپت ها صحیح تره. مثلاً برای بلوک سیریلیک ، utf8_unicode_ci برای این زبان ها Russian, Bulgarian, Belarusian, Macedonian, Serbian, و Ukrainian بهتره.


بیشتر میخوای اطلاعات بدست بیاری به لینک های زیر مراجعه کن:
http://forums.mysql.com/read.php?103,187048,188748
http://www.collation-charts.org/mysql60/mysql604.utf8_general_ci.european.html
http://www.collation-charts.org/mysql60/mysql604.utf8_unicode_ci.european.html
 

phpweb

Active Member
utf8_unicode_ci سرعتش یه مقدار کمتر از utf8_general_ci هست. Utf8_general_ci یه کلکشن خیلی ساده هست که فقط لهجه ها رو حذف می کنه بعد به حروف بزرگ تبدیل می کنه. مثلاً این حروف لاتین àáååāă رو با a برابر می دونه و تبدیل می کنه.
Utf8_unicode_ci عموماً برای اسکریپت ها صحیح تره. مثلاً برای بلوک سیریلیک ، utf8_unicode_ci برای این زبان ها russian, bulgarian, belarusian, macedonian, serbian, و ukrainian بهتره.


بیشتر میخوای اطلاعات بدست بیاری به لینک های زیر مراجعه کن:
http://forums.mysql.com/read.php?103,187048,188748
http://www.collation-charts.org/mysql60/mysql604.utf8_general_ci.european.html
http://www.collation-charts.org/mysql60/mysql604.utf8_unicode_ci.european.html
مطالبی که گفتید درسته ولی بنظرم بهتره که یه احتمال کوچیک بدیم که کاربر بخواد از لهجه ها استفاده کنه.
 

Cyletech

Member
مطالبی که گفتید درسته ولی بنظرم بهتره که یه احتمال کوچیک بدیم که کاربر بخواد از لهجه ها استفاده کنه.
درسته. ولی عبارات منظم رو گذاشتن برای چی؟ ترتیبی بده که فقط مثلاً گروه خاصی از واژگان استفاده کنن. من قبلاً یه پترن خوب واسه اینکار نوشته بودم. میتونی ازش استفاده کنی.
کد:
^[a-zA-Z0-9\?\؟\(\)\s\ض\ص\ث\ق\ف\غ\ع\ه\خ\ح\ج\چ\ش\س\ی\ب\ل\آ\ا\ت\ن\م\ک\گ\پ\ظ\ط\ز\ر\ذ\د\ی\و\ژ]+$
 

Domanjiri

Well-Known Member
درود بر شما

راجع به پترنی که جناب Cyletech نوشتند باید بگم که اگر هم بخوایم از چنین روش هایی استفاده کنیم، باید کاراکتر های بسیار بیشتری رو پوشش بدیم، الان شما توی نام کاربری افراد در همین انجمن ، کاراکترهایی رو می بینید که شما توی الگو قرار ندادین و...

اما راجع به تفاوت general و unicode در این لینک ، توضیحات زیر رو نوشته:
For any Unicode character set, operations performed using the xxx_general_ci collation are faster than those for the xxx_unicode_ci collation. For example, comparisons for the utf8_general_ci collation are faster, but slightly less correct, than comparisons for utf8_unicode_ci. The reason for this is that utf8_unicode_ci supports mappings such as expansions; that is, when one character compares as equal to combinations of other characters. For example, in German and some other languages “ß” is equal to “ss”. utf8_unicode_ci also supports contractions and ignorable characters. utf8_general_ci is a legacy collation that does not support expansions, contractions, or ignorable characters. It can make only one-to-one comparisons between characters.
به نظرم نیازی نیست که بخوایم ویژگی هایی که unicode داره (مثلن چند خط آخر متن بالا) رو فدای کمی سرعت بیشتر کنیم، البته اگه می دونید که نیازی به این موارد ندارید، قطعا از general استفاده کنید.

موفق باشید
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا