ورود

View Full Version : چگونه زمانی ارتباط بین جداول برقرار است جداول را پر کنیم...



viator
چهارشنبه 30 اردیبهشت 1394, 13:50 عصر
سلام به همه دوستان محترم
بنده سوالی برام به وجود اومده که نمی دونستم چطور اینو جستجو کنم ...
اگر تکراری یا مبتدی هست ببخشید.
سوال:
ما دو تا جدول در دیتا بیس داریم به شکل زیر:

131444

حالا من میخوام بدونم که وقتی می خوام در جداول دیتا وارد کنم چطور باید مقدار ID در جدول 1 رو با مقدار t1_id در جدول 2 رو همزمان و یکسان وارد کنم؟
چون در جدول 1 ستون ID به صورت auto number هست و نمیدونم چطور باید دقیقا همون مقدار رو در جدول 2 در ستون t1_id قرار بدم.
ممنون میشم کمکم کنید

SabaSabouhi
چهارشنبه 30 اردیبهشت 1394, 15:57 عصر
سلام به همه دوستان محترم
بنده سوالی برام به وجود اومده که نمی دونستم چطور اینو جستجو کنم ...
اگر تکراری یا مبتدی هست ببخشید.
سوال:
ما دو تا جدول در دیتا بیس داریم به شکل زیر:


حالا من میخوام بدونم که وقتی می خوام در جداول دیتا وارد کنم چطور باید مقدار ID در جدول 1 رو با مقدار t1_id در جدول 2 رو همزمان و یکسان وارد کنم؟
چون در جدول 1 ستون ID به صورت auto number هست و نمیدونم چطور باید دقیقا همون مقدار رو در جدول 2 در ستون t1_id قرار بدم.
ممنون میشم کمکم کنید

سلام
پاسخ به پرسش شما خیلی ساده نیست، چون مشکلات دیگه‌ای هم دیده می‌شه.

1. نام‌گذاری خیلی خیلی مهمه! متاسفانه تو کلاس‌ها و کتاب‌ها اول از ساخت جدول شروع می‌کنن، در حالی که باید از نام‌گذاری شروع کنن.
نام‌گذاری متدهای مختلفی داره، مهم نیست کدوم رو انتخاب می‌کنی فقط هر کدوم رو انتخاب می‌کنی بهش وفادار بمون. ضمن این که
پینگلیش نوشتن نام جدول یا ستون‌ها حتا برای یک مثال هم زشته ( با توجه به این که یه برنامه‌نویس معمولاً یا مهندس هست و یا دانش‌جو )
شما می‌تونی بجای Table2 از Goods و بجای Table1 از GoodPrices استفاده کنی و بجای Gheimat از Price یا UnitPrice استفاده کنی.

2. طراحی جدول‌ها کاملاً اشتباه به نظر می‌رسن. به شکلی که من متوجه شدم، جدول Table2 جدول کالا و جدول Table1 جدول بهای کالا هست.
در این صورت ارتباط دقیقاً باید برعکس چیزی باشه که شما انجام دادی.

3. شکل و شمایل جدول‌های شما نشون می‌ده که نیازی به دو جدول نداری، و برای نرمال‌سازی باید دو جدول رو ادغام کنی.

4. ثبت اطلاعات در دیتابیس معمولاً تو یه برنامه انجام می‌شه. اگه شما می‌گفتی که با چه زبانی، و در چه محیطی این کار رو انجام می‌دی، کار راحت‌تر بود.

در هر صورت شما «باید» برای این کار از Transaction استفاده کنی.

اگه از SP استفاده می‌کنی، باید با فرمان ( 'SELECT @Id = IDENT_CURRENT( 'MyTable مقدار Id از جدول کالا رو دریافت کنی و می‌تونی از این مقدار
برای ثبت قیمت کالا استفاده کنی.
اگه از SqlCommand استفاده می‌کنی هم همین فرمان مورد استفاده قرار می‌گیره.
اگه از EntityFramework استفاده می‌کنی با فراخوانی متد SaveChanges ( برای ذخیره تغییرات ) مقدار Id در شی ذخیره شده به‌روز می‌شه.

و اما یک توصیه دوستانه. طراحی دیتابیس چیزی هست که یا باید ( حداقل ) در سطح خیلی خوب انجام بدی، یا به کل ازش صرف‌نظر کنی و این بخش
رو واگذار کنی به یه نفر خبره. چون دیتابیس زیربنای هر سیستمی هست. و معمولاً مشکلات اصلی رو هنگام تولید گزارش‌ها که معمولاً آخرین مراحل
کار هست متوجه می‌شی که بعضی وقت‌ها دیگه خیلی دیر شده.

صبا صبوحی

viator
چهارشنبه 30 اردیبهشت 1394, 22:47 عصر
صبا صبوحی عزیز
از شما به خاطر این توضیحات کامل و اصولی ممنونم
این جداولی که گذاشتم به عنوان نمونه بود و کاملا با دیتابیس اصلی فرق می کنه
زبان برنامه نویسی VB.Net هست
برنامه یک سیستم انبار هست که قصد دارم یک جدول برای فاکتور که قیمت ، تعداد و نام فروشنده و ... رو در اون داشته باشم و جداول کالا های موجود در انبار رو جدا بسازم که در اون ها نام و اندازه و سایر صفات هر کالا در اونها قرار بگیره.
فکر می کنم فرمان ( 'SELECT @Id = IDENT_CURRENT( 'MyTable بتونه کاری که می خوام رو انجام بده...
باز هم ممنونم

مهدی نان شکری
چهارشنبه 30 اردیبهشت 1394, 23:03 عصر
با سلام و کسب اجازه از دوست و استادمان آقای صبوحی

برای این که مقدار Identity را به دست بیارید 3 روش برای این کار وجود دارد که عبارتند از
IDENT_CURRENT
@@IDENTITY
SCOPE_IDENTITY

ولی دقت نمایید استفاده از IDENT_CURRENT آخرین مقدار Identity برای جدول مورد نظر توسط هر Session و یا Scope را به شما برگشت می دهد.
به عبارت دیگر اگر چند کاربر همزمان به جدول مورد نظر Insert کنند ممکن است Identity برگشتی دست نباشد.

برای این کار از SCOPE_IDENTITY استفاده نمایید تا در صورت همزمانی مشکلی برای consistency داده ها پیش نیاید.

موفق باشید

viator
پنج شنبه 31 اردیبهشت 1394, 00:24 صبح
IDENT_CURRENT و @@IDENTITY چه تفاوتی با هم دارند؟

لطفا در مورد شکل دستوری در VB.Net هم یک مقدار بیشتر توضیح بدید
ممنون

مهدی نان شکری
پنج شنبه 31 اردیبهشت 1394, 10:59 صبح
با سلام


SELECT @@IDENTITY

آخرین مقدار Identity تولید شده در یک Session را برگشت می دهد. این مقدار صرف نظر از جدول و Scope تولید کننده Identity می باشد.
به عبارت دیگر اگر شما برای یک جدولی تریگری نوشته اید که بعد از Insert یک رکورد به جدول، رکوردی در جدول دیگری ثبت نماید در آن صورت استفاده از این دستور آخرین مقدار تولید شده را برگشت می دهد که در این مثال Identity مربوط به تریگر می باشد.


SELECT IDENT_CURRENT('tablename')

این دستور آخرین Identity تولید شده برای یک جدول مشخص را برگشت می دهد که این مقدار صرف نظر از Session و Scope تولید کننده می باشد. این دستور فقط جدول مشخص شده را مد نظر قرار می دهد.

این دستورات را می توانید در Sp مانند هر Select اسکالر دیگر مورد استفاده قرار دهید.
موفق باشید.

SabaSabouhi
پنج شنبه 31 اردیبهشت 1394, 11:12 صبح
با سلام و کسب اجازه از دوست و استادمان آقای صبوحی

برای این که مقدار Identity را به دست بیارید 3 روش برای این کار وجود دارد که عبارتند از
IDENT_CURRENT
@@IDENTITY
SCOPE_IDENTITY

ولی دقت نمایید استفاده از IDENT_CURRENT آخرین مقدار Identity برای جدول مورد نظر توسط هر Session و یا Scope را به شما برگشت می دهد.
به عبارت دیگر اگر چند کاربر همزمان به جدول مورد نظر Insert کنند ممکن است Identity برگشتی دست نباشد.

برای این کار از SCOPE_IDENTITY استفاده نمایید تا در صورت همزمانی مشکلی برای consistency داده ها پیش نیاید.

موفق باشید

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

اما تو این مورد خاص سلیقه‌ی من کمی با شما فرق داره، من همیشه‌ IDENT_CURRENT رو توی Transaction
استفاده می‌کنم، به همین دلیل مشکل همزمانی رو نخواهم داشت، و چون این فرمان نام جدول رو می‌گیره
ترجیح می‌دم از این استفاده کنم.
اگه جدول من یه Trigger داشته باشه که اون Trigger تو جدول دیگه‌ای Insert انجام بده، SCOPE_IDENTITY
مقدار Identity جدول دیگه‌ای رو به من می‌ده. من قبلاً تو یه پروژه به این مشکل خورده بودم، و به همین دلیل
از اون موقع به بعد، همیشه از IDENT_CURRENT استفاده می‌کنم. ( البته نه وقتی که پای EF وسط باشه )

صبا صبوحی