PDA

View Full Version : سوال: مشکل در جداول و دسته بندی ها



1sarbaz
جمعه 18 آذر 1390, 21:58 عصر
سلام

من برنامه نویس تازه کار هستم و در حال یادگیری پی اچ پی ولی در حال برنامه نویسی یک پروژه نسبتا بزرگ هستم .

مشکلاتم شاید برای شما ساده بیاد که ممنون میشم راهنماییم کنید .

کاربرانی که عضو سیستم من میشند اطلاعاتی رو ثبت میکنند و نیاز دارند که این اطلاعات دسته بندی بشه .

فرض کنید
سه جدول داریم که برای همه کاربران استفاده میشه .

1 - شناسه دسته - 2 - نام دسته
1 - شناسه مطلب 2 - مطلب - 3 - شناسه دسته
1 - شناسه مطلب 2- شناسه کاربر

باید اول ببینیم که کدوم مطالب مربوط به کاربر هست بعد بیایم ببینیم اون مطالب کاربر از چه دسته هایی استفاده کردند و اون دسته ها رو بر اساس حروف الفبا مرتب کنیم و بعد مطالب هر دسته زیر اون دسته با رعایت حروف الفبا بزاریم .

به نظرتون این کار مشکل پردازشی ایجاد نمیکنه سنگین نمیشه ؟ و سرعت لود نمیاد پایین ؟
با فرض اینکه یک دیتابیش خیلی بزرگ داشته باشم . ( میخوام اصولی باشه . )
نظرتون در این مورد چیه ؟

pejman_view
جمعه 18 آذر 1390, 22:54 عصر
سلام

ببخشید اما این سوال مربوط به بخش PHP نیست و بهتر است به بخش دیتابیس انتقالش دهید.

البته بگذارید یکم با هم در این باره صحبت کنیم:

به نظر من جدول سوم استفاده اش بیهوده است، اینگونه دیتابیس را سنگین تر می کنید. پس بهتر است به دو جدول تغییرش بدهید،
1 - شناسه دسته - 2 - نام دسته
1 - شناسه مطلب 2 - مطلب - 3 - شناسه دسته 4- شناسه کاربر


باید اول ببینیم که کدوم مطالب مربوط به کاربر هست بعد بیایم ببینیم اون مطالب کاربر از چه دسته هایی استفاده کردند و اون دسته ها رو بر اساس حروف الفبا مرتب کنیم و بعد مطالب هر دسته زیر اون دسته با رعایت حروف الفبا بزاریم .
نه دوست عزیز نرمالیزاسیون خیلی مهم است و کارتان را هم با وجود اینکه بنظر پیچیده تر می شود ساده تر هم می کند بهتر است تمام جداول یک به چند باشند.

با آرزوی موفقیت

1sarbaz
جمعه 18 آذر 1390, 23:09 عصر
سلام

ببخشید اما این سوال مربوط به بخش PHP نیست و بهتر است به بخش دیتابیس انتقالش دهید.

البته بگذارید یکم با هم در این باره صحبت کنیم:

به نظر من جدول سوم استفاده اش بیهوده است، اینگونه دیتابیس را سنگین تر می کنید. پس بهتر است به دو جدول تغییرش بدهید،
1 - شناسه دسته - 2 - نام دسته
1 - شناسه مطلب 2 - مطلب - 3 - شناسه دسته 4- شناسه کاربر


نه دوست عزیز نرمالیزاسیون خیلی مهم است و کارتان را هم با وجود اینکه بنظر پیچیده تر می شود ساده تر هم می کند بهتر است تمام جداول یک به چند باشند.

با آرزوی موفقیت

ممنون از توضیح خوبی که دادید به نظرم بهتره تاپیک توی همین بخش باشه . چون بیشتر سوالم مرتبط با PHP هست .

دلیل اینکه توی جدول دوم فیلد کاربری رو نگذاشتم این هست که ممکنه اون مطلب بین کاربران دیگه هم به اشتراک گذاشته باشه و در نتیجه نخواستم منحصر به یک کاربر باشه . ( برنامه ای که دارم مینویسم یک شبکه اجتماعی هست )

حالا با این توضیح نظرتون چیه و چه پیشنهادی دارید ؟ نرمالیزاسیون دقیقا یعنی چه ؟ جداول یک به چند یعنی چه ؟

ممنون منم برای شما آرزوی موفقیت میکنم .

saina2006
شنبه 19 آذر 1390, 00:19 صبح
حالا با این توضیح نظرتون چیه و چه پیشنهادی دارید ؟ نرمالیزاسیون دقیقا یعنی چه ؟ جداول یک به چند یعنی چه ؟

نرمالیزاسیون(NORMALIZATION) برای relational database هاست که باعث میشه فیلدها کمتر تکرار بشن یا به عبارت صحیحتر Redundancy رو از بین ببرید. در واقع یک سری قانونه که تغییراتی هم داشته و به صورت first normal form(1NF), 2NF, 3NF ,... 6NF برای اطلاعت بیشتر هم باید به کتابهای آموزش دیتابیس ها مراجعه کنید و در واقع یک قانون کلی هست و مربوط به DBMS خاصی نمیشه و هنگام طراحی دیتابیس باید مدنظر قرار بگیرن، در واقع طراحی که شما داشتید این قوانین رو در نظر گرفتید اما طرحی رو که دوستمون داده بود این قانون ها رو رعایت نکرده

جداول هم ارتباطشون با هم میتونه به سه صورت 1:1, 1:n و n:n باشه که در واقع تعداد بین یک ردیف از اطلاعات در یک جدول با جدول دیگه رو نشون میده به زبان ساده تر اگر شما دو تیبل داشته باشید که در یکی نام شخص و دیگری آدرس شخص وجود داشته باشه و هر شخص یک آدرس و هر آدرس مربوط به فقط یک شخص باشه این نوع ارتباط رو میگن 1:1
حالا اگر در جدولی نام شخص و در جدول دیگه شماره تلفن وجود داشته باشه و هر شخص بیش از یک شماره تلفن داشته باشه و هر شماره تلفن فقط به یک شخص مربوط باشه این ارتباط از نوع 1:n اما لزوما نباید شخص بیش از یک شماره تلفن داشته باشه
اگر شنا جدولی داشته باشید که اطلاعاتی در مورد نویسنده کتاب ها و جدولی در مورد کتاب ها داشته باشید و هر نویسنده بیش از یک کتاب نوشته باشد و هر کتاب بیش از یک نوینده داشته باشد ارتباط بین جداول از نوع n:n هست

در مورد اینکه جداول بهتر است یک به چند باشد صحیح نیست چون شما یا لازم است تعداد جداولتان را بیشتر کنید و یا اینکه قوانین normalization را نقض کنید

pejman_view
شنبه 19 آذر 1390, 01:06 صبح
سلام

دلیل اینکه توی جدول دوم فیلد کاربری رو نگذاشتم این هست که ممکنه اون مطلب بین کاربران دیگه هم به اشتراک گذاشته باشه و در نتیجه نخواستم منحصر به یک کاربر باشه
یعنی قرار است در جدول سوم دو تا رکورد با یک شناسه مطلب داشته باشید؟
نرمالیزاسیون مطلب گسترده ایی داره اما بطور خلاصه:
1- نباید چند دیتا قابل شکستن را در یک فیلد بریزید: فرضاً بجایی که یک فیلد آدرس بگذارید و تمامی آدرس مانند روبرو را بنویسید: آمریکا؛ آستن، راند راک 61154
در عوض فیلدها را می شکنیم و فیلد آدرس را به فیلدهای روبرو تقسیم می کنیم: کشور، استان، شهر و ...
2- بجای چپاندن همه فیلدها در یک جدول فیلدها رو تا می توانید تقسیم کنید توضیح زیاد نمی دم چون احساس کردم در جداول بالا ندانسته متوجه این قسمت شدی.
3- یک به چند ، چند به چند و چند به یک : یک بحث یک طولانی است دیگه وقت نوشتنش رو ندارم
شرمنده بعداً میام بیشتر توضیح می دم

1sarbaz
یک شنبه 20 آذر 1390, 23:56 عصر
ممنونم از توضیحاتی خیلی خوبی که دادید !

پس این طراحی که من دارم روی جدوالم انجام میدم بهش میگند نرمالیزاسیون !

من هنوز آماتورم و از این چیزها زیاد سرم نمیشه فقط برای این که جداولم رو به این شکل طراحی کنم کلی به مخم فشار آوردم :لبخند:

البته من حواسم نبود جداول بالا رو اشتباه نوشتم در اصل اینطوری طراحی کردم .

- شناسه دسته - 2 - نام دسته
1 - شناسه مطلب 2 - مطلب -
1 - شناسه مطلب 2- شناسه کاربر 3 - شناسه دسته

پس مشکلی نیست میتونم همینطوری طراحی کنم !؟

یک سوال خیلی خیلی مهم ذهن من رو اینجا مشغول کرده الان جداول بالا رو نگاه کنید به نظرتون PRIMARY KEY و UNIQUE KEY باید به چه شکلی تعریف بشند ؟! و ممنون میشم فرقش رو به زبان ساده بگید .

راستی برای نرمالیزاسیون منبعی ندارید برای مطالعه ؟ فقط ترجیحا فارسی باشه چون انگلیسیم خوب نیست .

ممنون.

pejman_view
دوشنبه 21 آذر 1390, 01:56 صبح
سلام

چی بگم ! نمی تونم به راحتی بر سر جداول اینطوری نظر بدم فقط باید کلید های خارجی و اصول نرمالیزاسیون رو رعایت کنید تا یک دیتابیس سریع داشته باشید

کلید اولیه : کلیدی است برای شناسایی رکوردها که بصورت یکتاست و معمولاً کلید خارجی در جداول دیگر است.
کلید یکتا: کلیدی است با ارزش یکتا که لزوماً برای شناسایی رکورد استفاده نمی شود. اما هر کلید خارجی یک کلید یکتاهم هست.

و نرمالیزاسیون یک اصل است که زیاد مقاله فارسی در این باره ندیدم تو گوگل هم جستجو کردم چیزی یافت نشد اما به انگلیسی جستجو کن "database normalization"

famarini
دوشنبه 21 آذر 1390, 06:46 صبح
سلام دوست من

این مقاله رو بخون