12 روز پیش ارسال اطلاعات یک فرم به دو جدول در دیتابیس
booysusa

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

ولی هرکاری میکنم فقط میتونم اطلاعات رو به یک جدول (Contact) ارسال کنم
اگر امکانش هست برنامه را بررسی کنید و در این زمینه من را یاری کنید
سپاس
لینک دانلود برنامه


اطلاعات برنامه:
ویژوال استودیو 2015
سی شارپ
دیتابیس اس کیو ال اکسپرس (بانک اطلاعاتی رو با خود برنامه ویژوال استودیو 2015 ساختم)
ده روز پیش
حاجی شریفی
مؤسس سایت
 
سلام
جدول KartMeli شما هیچ ارتباط/Relation ای به جدول اشخاص ندارد.
شما فقط دو ستون "سریال و نوع" را نگاه میدارید !
اگر اطلاعات 100 نفر را در این جدول ذخیره کنیم از کجا میخواهید بدانید کدام سطر برای کدام نفر است؟!

دو جدول میتوانند با هم رابطه یک به یک / یک به چند / چند به یک داشته باشند.
...

رابطه بین کاربر و کد ملی مگر یک-به-یک نیست؟
یک کاربر یک کد ملی دارد
و
یک کدملی برای یک کاربر است.
رابطه یک-به-یک را همیشه میتوان در یک جدول خلاصه کرد.

چرا کدملی را در همان جدول Contact نگاه نمیدارید؟ اصلا برای چه میخواهید دو جدول باشد؟
پیشنهاد من این است که کدملی را هم در همان جدول Contact نگهداری کنید.

گمانم شما باید مطالعات بیشتری در خصوص طراحی دیتابیس و مباحث نرمال سازی دیتابیس داشته باشید.
(من یا هرکسی در اینترنت تا حدی به شما توضیح میدهیم ولی نمیتوانیم مباحث یک کتاب 500 یا 700 صفحه ای را در چند خط حلاصه کرد)
ده روز پیش
booysusa

 
درود بر شما و سپاس بابت توضیحاتتان
نقل قول
گمانم شما باید مطالعات بیشتری در خصوص طراحی دیتابیس و مباحث نرمال سازی دیتابیس داشته باشید.

(من یا هرکسی در اینترنت تا حدی به شما توضیح میدهیم ولی نمیتوانیم مباحث یک کتاب 500 یا 700 صفحه ای را در چند خط حلاصه کرد)

بله شما درست می فرمائید مهندس، اطلاعاتم کافی نیست، البته ناگفته نماند در این چندماه تا حدودی مطالعه کردم مبحث یک به یک و چند به یک ...

نقل قول
چرا کدملی را در همان جدول Contact نگاه نمیدارید؟ اصلا برای چه میخواهید دو جدول باشد؟

پیشنهاد من این است که کدملی را هم در همان جدول Contact نگهداری کنید.

ممکنه است عناصر ورودی بیش از 150 داده باشند، نگه داشتن همگی در یک جدول Contact بنظرم کار درستی نیست و در برخی برنامه دیدم بیش از 10 جدول دارند که مایل بودم برنامه اصلی من اینگونه برنامه ای می بود

این برنامه که آپلوده شده است یک نمونه بود که اگر این روش را یاد میگرفتم، در برنامه اصلی اطلاعاتی بیشتری با جدول های بیشتری وارد می کردم، من مایل بودم ارتباط آنها با کدملی یا اینکه آیدی باشد
نه روز پیش
حاجی شریفی
مؤسس سایت
 
سلام
برای رابطه یک-به-یک میتوانید کلید/PrimaryKey را در جدول دوم تکرار کنید

مثلا من می خواهم فقط اطلاعات آخرین مدرک تحصیلی یک نفر را نگهداری کنم و به دلایلی این اطلاعات را در جدول جداگانه ای نگهداری میکنم
این جدول میتواند شامل رشته، مدرک، دانشگاه، تاریخ، موضوع پایان نامه، نمره و... و... باشد.

جدول اصلی (اول)
ContactID | FirstName | LastName | FatherName | ...
123 | Muhammad | Muhammadi | Ahmad ...


جدول دوم (آخرین مدرک تحصیلی)
ContactID | Title | Degree | University | ...
123 | Software | 15 | Princeton ...


بهتر است در جدول اول/اصلی ، PrimaryKey را AutoNumber/Identity قرار دهید.
یعنی خودکار عدد بگیرید و خودکار زیاد شود.
جدول اول یا اصلی همان جدولی است که مهم تر است و همیشه پر میشود.

ولی در جدول دوم به بعد باید AutoNumber/Identity خاموش باشد.
و در بقیه جداول با رابطه یک-به-یک فقط با نگهداری عدد PrimaryKey میتوانید رابطه را حفظ کنید و مشخص شود هر سطر به چه سطری مرتبط است.
نکته مهم وجود همین PrimaryKey یکسان در هر دوجدول است.



در این حالت برای Insert ، اول اطلاعات جدول اول را Insert میکنید و پس از تخصیص و به دست آوردن عدد Identity کلید جدید، سپس اقدام به Insert جدول دوم میکنیم.

برای Delete هم بهتر است برعکس عمل شود و اول جدول دوم و سپس سطر جدول اصلی حذف شود.

برای Update شرایط ساده تر است، چون Identity کلیدها ReadOnly و غیر قابل تغییر است، پس برای یک سطر همواره ثابت است و به دلخواه میتوانید هر کدام از جداول را Update کنید یا نکنید.

برای Select هم که باز با داشتن کلید ثابت، میتوانید سطر هر جدول را به دلخواه واکشی کنید.

این را هم عرض کنم که این جدول دوم را میتوان تعمیم داد به جدول سوم و چهارم و پنجم و....

با توضیحات فوق تلاشی کنید، حتما میتوانید انجامش دهید، مشکلی بود در خدمت تان هستم.
موفق باشید.
هشت روز پیش
booysusa

 
درود بر شما

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

فقط برای اینکه فعلا کارم پیش بره، آیا اگر دیتابیسم رو با یک جدول ببندم، یعنی همه اطلاعات در یک جدول باشند، در آینده میتونم تفکیکشون کنم؟ بیشتر نگرانی ام در این مورد هست، منظور از تفکیک یعنی بعدا میتونم بدون اسیب رسونده به اطلاعاتی که ذخیره شده، دیتابیسم رو درون چندین جدول بشکنم؟ و همچنین میتوانم فیلدهای مختلف به دیتابیس ایجاد کنم؟
هشت روز پیش
حاجی شریفی
مؤسس سایت
 
سلام مجدد
گرچه گفته میشود بهتر است کمتر ساختار داخلی دیتابیس تغییر کند ولی حقیقت آن است که تغییر ساختار دیتابیس اجتناب ناپذیر است و جزء روند عادی چرخه تکامل یک نرم افزار است.

و مشکلی هم از بابت تغییر دیتابیس در آینده وجود ندارد، فقط این تغییرات باید با دقت و اسکریپت های مناسب SQL انجام شود.
یعنی برای بروزرسانی دیتابیس باید یک SQL بنویسید که میتوانید بارها روی Backup دیتابیس ، آزمایش اش کنید تا از صحت آن مطمئن شوید.
مثلا برای شکستن یک جدول بزرگ به دو جدول کوچک در آینده کدی شبیه این نیاز خواهید داشت.
/*file: appname_upgrade_v1_0_0_0_to_v2_0_0_0.sql*/ 

CREATE TABLE new_table_name_1 (***columns***);

CREATE TABLE new_table_name_2 (***columns***);

INSERT INTO new_table_name_1(***new-columns***)
SELECT ***old-columns*** FROM old_table_name;

INSERT INTO new_table_name_2(***new-columns***)
SELECT ***old-columns*** FROM old_table_name;

DROP TABLE old_table_name;

/*exec sp_rename 'new_table_name_1', 'old_table_name';*/

/*ALTER TABLE table_3 ADD new_column_name int;*/

/*etc...*/

بازهم میتوانید قبل اجرا یک Backup از دیتابیس بگیرید تا در صورت بروز هر مشکلی بتوانید به نقطه قبل برگردید و با رفع نقص کار را مجدد تکرار کنید.

نقل قول نوشته شده توسط: ...
...فقط برای اینکه فعلا کارم پیش بره، آیا اگر دیتابیسم رو با یک جدول ببندم...

بنظرم این کار منطقی تر است.
وجود جداول یک-به-یک شرایط خاص دارد و برای تفکیک و ایزوله بودن بخش های متفاوت و بیربط مهم است وگرنه که من بخواهم فقط کد ملی را در یک جدول جداگانه نگاه دارم که این میشود تئوری جداول دو-ستونه ( شما میتوانید کل دیتابیس را با مجموعه بسیار بسیار زیاد جداول دو ستونه کلید-مقدار طراحی کنید ... )
مثلا یک بخش امنیتی و یک بخش پروفایلی برای کاربران داریم که اغلب هم خیلی با هم درگیر نیستند ولی رابطه یک-به-یک دارند و هرکدام شاید 10 فیلد یا بیشتر داشته باشند.
مقادیر مرتبط با احراز هویت مانند User,Pass,Email,Lockout,AccessFailedCount,SecurityStamp,LastLogin و...و.... و مقادیر پروفایلی مانند FirstName,LastName,Interest,Education,Picture و...و...
یعنی چون کدهای متفاوتی روی این دوبخش کار میکند، ;کتابخانه های dll ای آماده ای برای مدیریت امنیت و جداولش داریم و حتی UI-Page متفاوتی این دوبخش را ویرایش میکنند ( در تیم های برنامه نویسی، شاید افراد متفاوت بخش امنیت و پروفایل را بنویسند) و هر کدام هم فیلدهای زیاد خودشان را دارند، در این حالات شاید تصمیم بر آن شود که دو جدول یک-به-یک ایجاد شود.
وگرنه اینکه بخواهم فقط فیلد ها را دوتا دوتا سه تا سه تا در جداول جدید قرار دهم و آخر هم همیشه مجبورم همه را با هم در یک صفحه نشان دهم و همیشه هم همه را با هم ویرایش کنم و همه را با هم واکشی کنم و در Grid نشان دهم و همه را با هم ... اینطور که فقط کار خودم و کار دیتابیس را پیچیده تر و سنگین تر و کندتر میکنم.

موفق باشید.
دیروز
booysusa

 
درود بر شما سپاس

با توجه به راهنمایی ها و نکات شما ، 3 تا جدول درست کردم
1. جدول اکانت ها
2. جدول اطلاعات
3. جدول دفترچه تلفن (پروژه ای کوچک و جداگانه درون پروژه اصلی هست)

ولی بنظرتون یک دیتابیس جداگانه برای عکس ها و اسناد word و pdf و... نداشته باشم؟ (چگونگی ایجاد رابطه بین آنها را فعلا کار نکردم)

و یک نکته دیگر، بنظرتون ارسال بیش از 110 فیلد اطلاعات به دیتابیس و فراخوانی همه آنها باهم برای ویرایش(frmEditContact) کار درستی هست؟ (برای فرار از ساخت چندین جدول مرتبط باهم اینکار را کرده ام)




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

متوجه این جمله نشدم، نمیدانم شما موافق ساخت چند جدول هستید یا مخالف