View Full Version : از یک جدول استفاده کنم یا دو جدول ؟
farzane_t
چهارشنبه 11 اردیبهشت 1392, 19:28 عصر
سلام
درون دیتابیسم یه جدول دارم که اطلاعات مربوط به کاربران سایت رو نگه داری می کنم. اطلاعات هستن که کاملا اختیارین و من موقع ثبت نام کاربر این اطلاعات رو از کاربر نمی گیرم و کاربر برای تکمیلش باید از کنترل پنلش اینکارو انجام بده.
حالا سوالم اینه که این فیلدهای اختیاری که ممکنه هیج وقت هم پر نشن تو همون جدول نگهداری کنم یا درون یه جدول دیگه و بعد از join استفاده کنم.
چون تا جایی که میدونم داشتن فیلدهای زیاد درون یه جدول بهینه نیست از طرفی فیلدهای null زیاد هم برای جدول خوب نیست.
ممنون میشم راهنماییم کنید.
veniz2008
چهارشنبه 11 اردیبهشت 1392, 22:09 عصر
سلام.
اگر اسم جدول اولتون رو اطلاعات پایه کاربر بذاریم که اجبارا بایستی پر بشن (مثل نام کاربری، نام و نام خانوادگی و سال تولد و ...) و جدول دوم رو هم علاقه مندی های شخص بذاریم که ممکنه شخص مورد نظر هیچ علاقه مندی نداشته باشه (کلا بی احساس باشه! :لبخند: ) همونطور که با رنگ متمایز نشون دادم این یعنی دو موجودیت متفاوت و متمایز. پس منطقی نیست که با جدول اول ادغام بشه (شدنی هست ولی منطقی نیست).
اما برای رفع مشکل null بودن میتونید مقدار پیشفرض برای فیلدهاتون در نظر بگیرید که اگر کاربر مقداری وارد نکرد به جای null اون مقدار پیش فرض بشینه چراکه null مشکلاتی رو در join کردن و در شرطها برای شما ایجاد خواهد کرد.
اگر طراحی اصولی داشته باشید و از ایندکس های مناسب برای جداولتون استفاده کنید هزینه join اونقدرها محسوس نخواهد بود.
موفق باشید.
farzane_t
شنبه 14 اردیبهشت 1392, 18:30 عصر
ممنونم.
من یک فیلد UID در جدول اول دارم که کلید اولیه (و Identifier) تعریفش کردم. همین فیلد رو در جدول دوم کلید خارجی تعریف کردم. چطور باید عمل درج رو انجام بدم که اگه نتیجه درج در مورد اول موفقیت آمیز بود عمل درج دوم انجام بشه و تازه همون id که در جدول اول درج شده اینجا هم درج بشه. میدونم که باید از transaction استفاده کنم. درون .net بلدم اینکارو انجام بدم. اگه بخوام همه اینکارا درون خود sql انجام بشه باید چکار کنم؟
farzane_t
شنبه 14 اردیبهشت 1392, 18:31 عصر
و یه سوال دیگه اینکه، بهتره اینکار درون .net انجام بشه یا خود sql؟
veniz2008
یک شنبه 15 اردیبهشت 1392, 13:43 عصر
ممنونم.
من یک فیلد UID در جدول اول دارم که کلید اولیه (و Identifier) تعریفش کردم. همین فیلد رو در جدول دوم کلید خارجی تعریف کردم. چطور باید عمل درج رو انجام بدم که اگه نتیجه درج در مورد اول موفقیت آمیز بود عمل درج دوم انجام بشه و تازه همون id که در جدول اول درج شده اینجا هم درج بشه. میدونم که باید از transaction استفاده کنم. درون .net بلدم اینکارو انجام بدم. اگه بخوام همه اینکارا درون خود sql انجام بشه باید چکار کنم؟
اگر برنامه شما نیاز داره که تمام اطلاعات کاربر (اطلاعات پایه و علاقه مندی ها و ...) حتما گرفته و ثبت بشه میتونید از همون transaction ها کمک بگیری.
ولی همیشه اینطوری نیست. در بعضی از برنامه ها چیزی که اهمیت داره اطلاعات پایه کاربر هست و ابتدا این اطلاعات ثبت میشه و بعد از اون اطلاعات فرعی گرفته میشه. حالا ممکنه به هر دلیلی اطلاعات فرعی (مثل علاقه مندی ها) در اون لحظه تکمیل نشه(به هر دلیلی چه به اختیار کاربر و چه به اجبار که میتونه خروج اجباری از برنامه باشه مثل قطع برق سیستم و ...) و بعدا بخوایم این اطلاعات رو برای اون شخص ثبت کنیم.این حالت بیشتر در برنامه های Application و ویندوزی اتفاق می افته و در برنامه های تحت وب معمولا وارد کردن تمام اطلاعات به منزله ثبت نهایی کاربر هست وگرنه اون شخص ثبت نشده تلقی میشه. پس همه چیز به برنامه شما بستگی داره.
و یه سوال دیگه اینکه، بهتره اینکار درون .net انجام بشه یا خود sql؟
دستورات و کوئری ها رو همیشه ببرید سمت sql . اینطوری هم امنیت بیشتری دارید و هم سرعت بیشتری رو تجربه میکنید.
موفق باشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.