PDA

View Full Version : Insert های متعدد بر اساس شروط خاص یا فقط یک درج و پاس دادن مقادیر نال



bftarane
شنبه 23 فروردین 1393, 22:19 عصر
یه وب سایت آژانس املاک هست که بر اساس نوع معامله
و نوع ملک فیلدها عوض میشن
مثلاً اگه نوع ملک آپارتمان باشه
یه سری فیلدها لازم هستن درج بشن که اگه نوع ملک زمین باشه فیلدهای دیگری خواهیم داشت و یه سری فیلدهای مشترک
مثل نشانی و ...


نوع معامله می تونه موارد زیر باشه
رهن
رهن و اجاره
فروش
پیش فروش
فروش اقساطی
مشارکت در ساخت
معاوضه

و نوع ملک موارد زیر
واحد آپارتمانی
مستغلات که خودش به سه سطح دیگه تقسیم میشه (خانه، ویلا، کلنگی) که اینا هم خودشون تقسیم میشن به (مسکونی، تجاری، اداری، ...)


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

حالا تصمیم گرفتم درج رو به شکل زیر انجام بدم


//اگر فروش
//t_Sale
if (true)
{
//اگر نوع ملک واحد آپارتمانی
//t_Property
// t_Option
//t_ApartmentUnit
if (true)
{
//درج در سه جدول

}


//اگر نوع ملک مستغلات
//t_Property
// t_Option
//t_tenement
if (true)
{
//درج در سه جدول
}



// اگر نوع ملک زمین
//t_Property

//t_land
if (true)
{
//درج در دو جدول
}

//اگر نوع ملک مغازه،هتل،...
//t_Property

if (true)
{
درج در یک جدول
}



اگه میخواستم فقط یک جدول در نظر بگیرم، فرضاً در نوع ملک زمین چون زمین خیلی از فیلدها مثل امکاناتی از قبیل آشپزخانه و غیره رو نداره
باعث می شد خیلی فیلدها خالی بمونه بنابراین تصمیم گرفتم جدولم رو جدا کنم

همینطور دلیل دیگه ام این بود که مشتری خواسته اگه فرضاً کاربر زمین رو انتخاب کرد یه سری آپشن ها دیده نشه دیگه بنابراین من یا مجبور بودم به ازای هر نوع ملک یک Insert
بنویسم یا فقط یک Insert بنویسم ولی خیلی از فیلدها رو null پاس بدم


حالا از شما مشورت می خواستم، به نظرتون کارم درسته یا نه؟

PDFای که مشتری خودش تهیه کرده و من با توجه به اون جداولم رو طراحی کردم رو هم ضمیمه کردم، اگه لازم بود بگید جداول رو هم قرار بدم.
راستش من تا به حال همچین پروژه پیچیده ای انجام نداده بودم و خیلی سردرگم هستم، لطفاً راهنمایی کنید.

خوبی یه جدول این بود که واکشی خیلی آسون میشد و همینطور جستجوی پیشرفته هم فکر کنم آسون تر می شد ولی نمی دونم روش اصولی چی می تونه باشه.

alireza_s_84
شنبه 23 فروردین 1393, 22:58 عصر
یه وب سایت آژانس املاک هست که بر اساس نوع معامله
و نوع ملک فیلدها عوض میشن
مثلاً اگه نوع ملک آپارتمان باشه
یه سری فیلدها لازم هستن درج بشن که اگه نوع ملک زمین باشه فیلدهای دیگری خواهیم داشت و یه سری فیلدهای مشترک
مثل نشانی و ...


نوع معامله می تونه موارد زیر باشه
رهن
رهن و اجاره
فروش
پیش فروش
فروش اقساطی
مشارکت در ساخت
معاوضه

و نوع ملک موارد زیر
واحد آپارتمانی
مستغلات که خودش به سه سطح دیگه تقسیم میشه (خانه، ویلا، کلنگی) که اینا هم خودشون تقسیم میشن به (مسکونی، تجاری، اداری، ...)


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

حالا تصمیم گرفتم درج رو به شکل زیر انجام بدم


//اگر فروش
//t_Sale
if (true)
{
//اگر نوع ملک واحد آپارتمانی
//t_Property
// t_Option
//t_ApartmentUnit
if (true)
{
//درج در سه جدول

}


//اگر نوع ملک مستغلات
//t_Property
// t_Option
//t_tenement
if (true)
{
//درج در سه جدول
}



// اگر نوع ملک زمین
//t_Property

//t_land
if (true)
{
//درج در دو جدول
}

//اگر نوع ملک مغازه،هتل،...
//t_Property

if (true)
{
درج در یک جدول
}



اگه میخواستم فقط یک جدول در نظر بگیرم، فرضاً در نوع ملک زمین چون زمین خیلی از فیلدها مثل امکاناتی از قبیل آشپزخانه و غیره رو نداره
باعث می شد خیلی فیلدها خالی بمونه بنابراین تصمیم گرفتم جدولم رو جدا کنم

همینطور دلیل دیگه ام این بود که مشتری خواسته اگه فرضاً کاربر زمین رو انتخاب کرد یه سری آپشن ها دیده نشه دیگه بنابراین من یا مجبور بودم به ازای هر نوع ملک یک Insert
بنویسم یا فقط یک Insert بنویسم ولی خیلی از فیلدها رو null پاس بدم


حالا از شما مشورت می خواستم، به نظرتون کارم درسته یا نه؟

PDFای که مشتری خودش تهیه کرده و من با توجه به اون جداولم رو طراحی کردم رو هم ضمیمه کردم، اگه لازم بود بگید جداول رو هم قرار بدم.
راستش من تا به حال همچین پروژه پیچیده ای انجام نداده بودم و خیلی سردرگم هستم، لطفاً راهنمایی کنید.

خوبی یه جدول این بود که واکشی خیلی آسون میشد و همینطور جستجوی پیشرفته هم فکر کنم آسون تر می شد ولی نمی دونم روش اصولی چی می تونه باشه.

خصوصیات مشترک رو در همون جدول سپرده ها قرار بدین و برای خصوصیات متغیر یک جدول به اسم خصوصیات سپرده درست کنید. بعد یک جدول واسط میذارین با 3 فیلد: id ، id خصیصه و مقدار خصیصه
بعد برای هر سپرده اینها رو مقدار دهی میکنید. اینطوری اصلا فیلد نال نخواهید داشت ولی تعداد Insert های شما زیاد میشه. اگه از EF استفاده میکنید مشکلی وجود نداره ولی در صورتیکه از ADO.Net استفاده میکنید میبایست عملهای Insert رو در Transaction قرار بدین.

bftarane
یک شنبه 24 فروردین 1393, 09:56 صبح
ممنون از پاسخ. اجازه بدید دارم یک دیاگرام از جداولم درست می کنم اینجا قرار بدم برای راهنمایی بهتر.

bftarane
یک شنبه 24 فروردین 1393, 10:17 صبح
کل جداولم رو در فایل ضمیمه می تونید ببینید.
این هم صفحه ثبت ملک http://dentaliran.ir/addfile.aspx


برای آپارتمان و زمین و مستغلات هم هر کدوم یه جدول در نظر گرفتم چون اینا هم فیلدهاشون با هم فرق دارن.
117921

اینم جداول مربوط به نوع معامله (فروش، پیش فروش، مشارکت در ساخت، ...)
117922

bftarane
یک شنبه 24 فروردین 1393, 11:53 صبح
....................................

bftarane
دوشنبه 25 فروردین 1393, 10:10 صبح
خصوصیات مشترک رو در همون جدول سپرده ها قرار بدین و برای خصوصیات متغیر یک جدول به اسم خصوصیات سپرده درست کنید. بعد یک جدول واسط میذارین با 3 فیلد: id ، id خصیصه و مقدار خصیصه
بعد برای هر سپرده اینها رو مقدار دهی میکنید. اینطوری اصلا فیلد نال نخواهید داشت ولی تعداد Insert های شما زیاد میشه. اگه از EF استفاده میکنید مشکلی وجود نداره ولی در صورتیکه از ADO.Net استفاده میکنید میبایست عملهای Insert رو در Transaction قرار بدین.

دیروز اشتباه متوجه منظورتون شده بودم. چند بار دیگه خوندم جوابتون رو. ولی متوجه نمی شم.

ببینید، چیزی که من از پاسخ شما می فهمم
یه جدول اصلی به اسم main
که در اون فیلدهای مشترک مثل آدرس، نوع ملک ذخیره میشه

یه جدول دیگه برای متغیرها
مثلاً زمین و کلنگی می تونه دارای فیلدهای اصلاحی، تراکم ساخت و پهنه باشه که بقیه انواع ملک این رو ندارن

ملک های به غیر از زمین به بعد (منظور از به بعد: مغازه، هتل، رستوران، تالار، باغ، باغچه، کارخانه، کارگاه، انبار و ... است)
می تونن مثلاً دزدگیر و تعداد آسانسور داشته باشن

البته فیلدها خیلی زیادن ولی برای قابل فهم بودن من کم گذاشتم



حالا طبق استنباطم از پاسخ شما یه جدول واسط گذاشتم
که idهای دو جدول قبلی در اون قرار می گیره
ولی من منظور از مقدار رو متوجه نشدم
خوب همه مقادیر که یک نوع نیستند
117956

من خیلی متوجه منظورتون نشدم، اگه با چند تا داده مثال بزنید ممنون میشم. و اصلاً نمی فهمم چطور اینطوری فیلدی نال نمی مونه یا اینکه دیگه وقتی به ازای هر نوع ملک یا هر نوع معامله یه جدول جداگانه نداریم چرا گفتید که درج ها با این روش زیاد میشه؟ این طوری که فکر کنم سه تا درج بیشتر نیست.
پست های قبلی رو ویرایش کردم که کوتاه تر بشه، فکر کنم اونقدر طولانی بود بچه ها حوصله خوندن نداشتن.

دغدغه من اینه که هم جداولم اصولی باشن هم موقع واکشی اطلاعات مخصوصاً در جستجوی پیشرفته که نیازه به همه فیلدها که در جداول مختلف هستند دسترسی داشته باشیم کار پیچیده یا غیرممکن نشه.
مثلاً در یک پروژه بود که از تعداد زیادی جدول استفاده شده بود و همه این جداول به کمک یک id به هم وابسته شده بودن. اگه فقط در یکی از این جداول رکوردی با این id مشترک درج نمی شد در جستجوی پیشرفته چون تمام این جداول join زده شده بودن، دیگه هیچ اطلاعاتی نشون داده نمی شد و من مجبور شدم حتی اگه کاربر اطلاعات اون جدول رو هم درج نمی کرد خودم null درج کنم تا اون id مشترک ایجاد بشه.

دقیقاً با روش خودم یعنی جداول مختلف به ازای نوع ملک ها و نوع معامله ها هم اگه کاربر نوع معامله رو مشخص نکنه همین مشکل پیش می یاد یعنی در جداول نوع معامله به ازای ملک ثبت شده دیگه هیچ id مشترکی وجود نخواهد داشت که اگه قرار به join زدن باشه این ایجاد مشکل می کنه پس مجبور می شم نوع معامله رو اجباری کنم.

mRizvandi
چهارشنبه 27 فروردین 1393, 23:31 عصر
مثلاً در یک پروژه بود که از تعداد زیادی جدول استفاده شده بود و همه این جداول به کمک یک id به هم وابسته شده بودن. اگه فقط در یکی از این جداول رکوردی با این id مشترک درج نمی شد در جستجوی پیشرفته چون تمام این جداول join زده شده بودن، دیگه هیچ اطلاعاتی نشون داده نمی شد و من مجبور شدم حتی اگه کاربر اطلاعات اون جدول رو هم درج نمی کرد خودم null درج کنم تا اون id مشترک ایجاد بشه.

دوست عزیز Join زده روشهای مختلفی داره، شما می تونستید از Left Join یا Right Join استفاده کنید تا بتونید اگر داده ای در جدولی وجود نداره اون رو هم پیدا کنید!
پیاده سازی اون پروژه که جداول با آی دی با هم مرتبط بوده اند درست بوده.
فرض کنید می خواهید اطلاعات پرونده پزشکی یک شخص را ثبت کنید، شامل:
مشخصات فردی (آی دی کاربر، نام، نام خانوادگی و ...)
مشخصات پزشکی (آی دی، آی دی کاربر، گروه خونی، قد، وزن، و ...)
گزارش شنوایی سنجی (آی دی، آی دی کاربر،تاریخ، گوش چپ، گوش راست و ...)
گزارش بینایی سنجی (آی دی، آی دی کاربر،تاریخ، چشم چپ، چشم راست و...)
بیماریهای خاص (آی دی، آی دی کاربر،نام بیماری، آزمایش و ...)

خب وقتی قرار باشه این پرونده پر بشه، مطمنا ممکنه به جز مشخصات فردی دیگه اطلاعاتی برای شخص ثبت نشده باشه.
حالا اگر قرار هست توی همه این فیلدها چیزی جستجو بشه و شما نیاز داشته باشید که بین همه جداول Join بزنید می تونید از Left Join استفاده کنید و اگر داده ای در یکی از جداول نباشه همچنان نتیجه Join دیتا خواهد داشت.

bftarane
پنج شنبه 28 فروردین 1393, 00:21 صبح
خب وقتی قرار باشه این پرونده پر بشه، مطمنا ممکنه به جز مشخصات فردی دیگه اطلاعاتی برای شخص ثبت نشده باشه.
حالا اگر قرار هست توی همه این فیلدها چیزی جستجو بشه و شما نیاز داشته باشید که بین همه جداول Join بزنید می تونید از Left Join استفاده کنید و اگر داده ای در یکی از جداول نباشه همچنان نتیجه Join دیتا خواهد داشت.
خیلی خوشحال شدم این جواب رو دادید چون خودم هم به تازگی به این نتیجه رسیده بودم. ممنونم که مطمئنم کردید.