PDA

View Full Version : کدام شیوه طراحی دیتابیس در مورد فیلد خارجی اصولی تر است؟



trustmiracle
دوشنبه 28 مرداد 1392, 20:22 عصر
سلام. من یکسری جداول در دیتابیسم دارم که در زیر می توانید ببینید. یک جدول پروفال هست که اطلاعات یک شرکت درش ثبت میشه. هر شرکت یکسری گروه داره و یک سری هم یوز داریم. یوزر ها می توانند در شرکت عضو شوند. یک یوزر می تواند در چند پروفایل عضو باشد و بعد از عضو شدن می تواند در گروه های آن پروفایل عضو شود. حالا با توجه به این اطلاعات یک نگاه به جدول group_user بیاندازید. بهتر این هست که کد گروه بیاد و کد یوزر یا اینکه کد گروه بیاد و در جدول profile_user هم یک کلید اضافه شود و این کلید به عنوان کد یوزر بیاد؟ یا اصلا فرقی نداره.
من به نظرم اومد روش اول ساده تر هست ولی روش دوم اطمینان میده که کاربریکه هنوز عضو یک پروفایل نشده نتواند عضوی گروهی از آن پروفایل بشود.

109343

محمد سلیم آبادی
دوشنبه 28 مرداد 1392, 23:55 عصر
در روش دومی که ارائه دادین باز هم چنین اطمینانی حاصل نخواهد شد. شما فقط میتونید مطمئن بشید که آن کاربر حتما عضو یک شرکت هست نه اینکه لزوما آن کاربر عضو شرکتی است که گروه مورد نظر وابسته به آن است (البته بعدا برای بدست آوردن مشخصات کاربر در این روش دچار مشکل خواهید شد).
راه حلی که بنظرم میرسه استفاده از روش اول یعنی آوردن کلیدهای دو جدول کاربر و گروه هاست برای جدول users_groups (و ترکیب آنها به عنوان PK که اینکار را انجام دادین) و در کنار آن رعایت data integrity از طریق trigger تا صحت اطلاعات تضمین شود.
به عبارتی کاربری عضو گروهی نشود که آن گروه وابسته به شرکت هایی که کاربر در آن عضو است نباشد.

trustmiracle
سه شنبه 29 مرداد 1392, 12:12 عصر
ممنون. فقط در مورد روش دوم اشتباه نمی کنید. ببینین من روش دوم منظور به شکل زیر هست. تا وقتی یک کاربر عضو شرکتی نشده خوب فیلدی هم در جدول profile_user براش ثبت نمیشه تا کلیدی هم ثبت نشه در جدول group_user نمی تواند اضافه شود دیگه.

109380

محمد سلیم آبادی
سه شنبه 29 مرداد 1392, 12:25 عصر
این دیاگرام از طریق چه نرم افزاری تولید شده؟
آیا یک گروه می تواند همزمان وابسته به چند شرکت باشه؟ اگر جواب مثبت هست پس در دیاگرام خبری از جدول groups دیده نمیشه.
یا اینکه هر گروهی فقط یک شرکت داره؟

trustmiracle
سه شنبه 29 مرداد 1392, 12:43 عصر
نه یک گروه نمی تواند متعلق به دو تا شرکت باشه. هر گروه فقط متعلق به یک شرکت هستش. دیاگرام با MySQL Workbench درست شده. البته چون سوال حالت عمومی داشت و تاپیک sql هم بخش تحلیل و طراحی داشت اینجا پرسیدم.گروه یک ساختار درختی داره. ریشه گروه ایدیش در فیلد group_root از جدول profile ذخیره میشه.

محمد سلیم آبادی
سه شنبه 29 مرداد 1392, 16:54 عصر
من کامل متوجه روش دوم شدم (از همون ابتدا). اما هیچ معنا و مفهومی نمیتونه داشته باشه. جز اینکه شما داده ها را ملزم میکنید که در دو جدول user_profile و group_profile باشند. اما این بررسی صورت نمی تونه بگیره که آن گروه متعلق به همان شرکتی است که کاربر در آن عضو است.

مثلا در داده های زیر

جدول کاربر-شرکت
1 حسن شرکت3

جدول گروه-شرکت
گروه1 شرکت1

الان با این داده ها راحت عمل درج در جدول users_group شکل خواهد گرفت یعنی درج 1 برای ستون کدکاربرشرکت و مقدار گروه1 برای ستون گروه. در حالی که کاربر در شرکت شماره 3 عضو ولی گروه متعلق به شرکت 1 و آن کاربر در شرکت 1 هیچ نقشی نداره!

به عنوان نتیجه گیری. از همون روش اول استفاده کنید. و با کمک یک قید یا trigger (در صورتی که MySQL ازش پشتیبانی میکنه) صحت داده ها رو تضمین کنید.