PDA

View Full Version : ارتباط بین چند بانک اطلاعاتی ...



Mahmood_M
دوشنبه 24 مهر 1385, 00:25 صبح
سلام
من دارم روی یک برنامه کتابخونه کار می کنم ...
یک قسمت رو برای لیست کتابها گذاشتم ...
برای ثبت کتاب توی این قسمت ، کاربر باید اول از همه موضوعات رو بسازه ، مثلا یه جدول جدا توی بانک باشه که توش موضوعات ثبت بشه ، من می خوام که کاربر بتونه برای هر موضوع به تعدا دلخواه زیر گروه بزاره ، مثلا فرض کنید یک موضوع برای کتابهای علمی می سازه بعد بتونه براش مثلا حیوانات یا نجوم یا ... رو به عنوان زیر گروه تعریف کنه ...
مشکل من اینجاست که نمی دونم باید زیر گروه ها رو توی یک بانک دیگه تعریف کنم یا توی همون جدول موضوعات اصلی بزارم ...
موقع ثبت کتاب هم کاربر موضوع و زیر گروه رو انتخاب می کنه ( ( توی فرم ثبت کتاب دو تا ComboBox هست که اولی برای موضوعات و دومی برای زیر گروه ها هستش ، با انتخاب هر موضوع از ComboBox اول ، ComboBox دوم هم با زیر گروه های اون پر می شه ))
مشکل من توی ارتباط بین این فیلدها و جدولهاست ...
مثلا چه طور باید کاری کنم که مثلا جدول موضوعات با فیلدهای زیر گروه ارتباط داشته باشه ...
راستش توی تعریف زیر گروه هم مشکل دارم :
وقتی کاربر توی قسمت موضوعات یک موضوع جدید ثبت می کنه ، توی جدول مربوط به زیرگروه ها باید یک فیلد مربوط به همون موضوع اضافه بشه ؟؟
خلاصه امیدوارم که منظورم رو درست رسونده باشم ...
منتظر راهنمایی های شما هستم ...
با تشکر...

mehdi_mohamadi
دوشنبه 24 مهر 1385, 07:29 صبح
می تونی از view برای حل مشکلت استفاده کنی

Mahyaa
دوشنبه 24 مهر 1385, 07:54 صبح
مشکل من اینجاست که نمی دونم باید زیر گروه ها رو توی یک بانک دیگه تعریف کنم یا توی همون جدول موضوعات اصلی بزارم ...
قاعدتا باید زیر گروه ها در جدول جدا باشند . در غیر اینصورت در سطح 2NF نرمال نیست.
مهمترین دلیلش هم اینه که به بیان ساده اگه توی همون جدول گروه ها باشند یا اطلاعاتت به صورت آرایه ای در میاد یا اینکه مجبوری اطلاعات تکراری در اون ذخیره کنی . یک مثال برای خودت بزنی عملا میتونی ببینی .

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

Mahmood_M
چهارشنبه 26 مهر 1385, 06:23 صبح
سلام

می تونی از view برای حل مشکلت استفاده کنی
منظورت Tree View هست ؟ ! ، مرسی ، راه حل خوبیه ( حتما امتحان می کنم ) ...

قاعدتا باید زیر گروه ها در جدول جدا باشند . در غیر اینصورت در سطح 2NF نرمال نیست.
مهمترین دلیلش هم اینه که به بیان ساده اگه توی همون جدول گروه ها باشند یا اطلاعاتت به صورت آرایه ای در میاد یا اینکه مجبوری اطلاعات تکراری در اون ذخیره کنی . یک مثال برای خودت بزنی عملا میتونی ببینی .

با این توصیف جواب سوال دیگه هم داده میشه دیگه . یعنی اگر یک فیلد در جدول گروه های اصلی داری به نام ID که کلید اون جدولت باشه در جدول دوم باید از این به عنوان کلید خارجی استفاده کنی .
ممنونم ...
تا یه جایی جواب سئوالم رو گرفتم ...
ولی اگه یه خورده بیشتر توضیح بدید ممنون می شم !
سئوال اصلی من اینه :
اگه یک موضوع در جدول مربوط به موضوعات ثبت شد ، آیا باید فیلدی در جدول زیرگروه ها برای موضوع جدید ثبت شده ، ایجاد بشه ؟
اگه نه ، راه حلش چیه ؟
راستش مشکل اصلی اینه که نمی دونم کدوم فیلد باید با کدوم فیلد در کدوم جدول ارتباط داشته باشه !!
اگه کسی در این مورد من رو راهنمایی کنه ممنون می شم ...
با تشکر از همگی ...
منتظر جوابتون هستم ...

Mahyaa
چهارشنبه 26 مهر 1385, 18:13 عصر
مشکل من اینجاست که نمی دونم باید زیر گروه ها رو توی یک بانک دیگه تعریف کنم یا توی همون جدول موضوعات اصلی بزارم

سلام
فکر کنم اشتباهی شده . من در پست قبلی منظورت رو متوجه نشده بودم.
در این موردی که میگی ، به نظر میرسه گروه ها و زیرگروه ها تفاوت داده ای باهم ندارند . یعنی مثلا یک ID دارند و یک Name .پس لزومی نداره و شاید بهتره بگم که نباید از هم جدا بشن .
برای مشخص کردن ساختار زیرگروه بودن اون هم میتونی از یک فیلد مثلا ParentID برای مشخص کردن گروه اصلی اون زیر گروه استفاده کنی .


اگه یک موضوع در جدول مربوط به موضوعات ثبت شد ، آیا باید فیلدی در جدول زیرگروه ها برای موضوع جدید ثبت شده ، ایجاد بشه ؟
اگه نه ، راه حلش چیه ؟

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

امیدوارم این چیزی که گفتم کمک کنه . اگر صلاح میدونی نوع اطلاعاتی را که برای هرکدوم از اشیا میخواهی نگهداری کنی بگو تا روی داده های واقعی که داری صحبت بشه.

Mahmood_M
پنج شنبه 27 مهر 1385, 20:37 عصر
سلام
بابت توضیحات ممنونم ...

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

http://nabeghehmn.persiangig.com/Ketabdar/KMPics/Groups.gif

توی شکل بالا اگر دقت کنی تعداد گروه ها و زیر گروه ها مشخص نیست ...
حالا فرض کن که جدول گروه ها از جدول زیر گروه ها جدا هست ...
حالا کاربر یک گروه جدید ثبت می کنه و می خواد که براش زیر گروه تعریف کنه ...
آیا بعد از ثبت یک گروه ( در واقع یک رکورد در جدول گروه ها ) ، باید یک فیلد هم در جدول زیر گروه ها ثبت بشه تا نام زیر گروه ها رو توش ثبت کنه ؟
مشکل اصلی همین جاست ...
راستش خودم چند تا راه حل به مظرم می رسه ولی زیاد مطمئن نیستم ...
یکی این که از یک Query استفاده کنم برای زیر گروه ها ( به جای جدول ) و این Query به جدول گروه ها ارتباط داشته باشه ، ولی بازم بعد از ثبت هر رکورد باید یک Query ساخته بشه !!
دومین راه ( یک سئوال ) : ، آیا میشه که برای یک فیلد در یک جدول یک زیر فیلد !! ثبت کرد ؟
منظورم از زیر فیلد توی عکس زیر مشخصه :

http://nabeghehmn.persiangig.com/Ketabdar/KMPics/FandZ.gif

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

Mahmood_M
جمعه 28 مهر 1385, 06:50 صبح
بازم سلام

اگر صلاح میدونی نوع اطلاعاتی را که برای هرکدوم از اشیا میخواهی نگهداری کنی بگو تا روی داده های واقعی که داری صحبت بشه.
راستش منظورت رو خوب نفهمیدم ...
ولی اگه منظورت اطلاعات مربوط به کتابهاست که من این اطلاعات رو ذخیره می کنم : نام کتاب ، نام نویسنده ، ناشر ، شابک ، شماره کتاب ، تاریخ ثبت و ...
بانک اطلاعاتی من هم اکسس هست ...
موفق باشی ...

Mahmood_M
شنبه 29 مهر 1385, 00:39 صبح
کسی نمی خواد کمکم کنه ؟
منتظرم ...

sarvestan
شنبه 29 مهر 1385, 11:28 صبح
یه جواب بده ببینم درست فهمیدم یا نه!

میتونی از 2 تا فیلد کمکی استفاده کنی ! یکی مربوط به اینکه آیا این رکوردت یک شاخه(یا زیر شاخه) است یا نه و یک فیلد دیگه مربوط به اینکه پدر این رکوردت چیه!(ID رکورد شاخه پدر)

به مدل داده ای زیر نگاه کن
ID = int
name = varchar(50)
parentID = int
isLeaf = bit

حالا یه مثال برای توضیح مدلم میارم تا شاید مفهوم تر بشه!

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

حالا با توجه به نمودار توی شکل و مدل داده ای که بالاتر گفتم مقادیر جدول رو هم می نویسم:
(ترتیب اعداد زیر از چپ به راست برابر ستون های جدولم است)
1 'name' NULL 0
2 'name' 1 0
3 'name' 1 0
4 'name' 3 1
5 'name' 3 1
6 'name' 3 0
7 'name' 3 1
9 'name' 1 0
10 'name' 6 1

Mahyaa
شنبه 29 مهر 1385, 16:47 عصر
میتونی از 2 تا فیلد کمکی استفاده کنی ! یکی مربوط به اینکه آیا این رکوردت یک شاخه(یا زیر شاخه) است یا نه و یک فیلد دیگه مربوط به اینکه پدر این رکوردت چیه!(ID رکورد شاخه پدر)

به نظر من احتیاج به دوتا فیلد نیست .یک فیلد کفایت میکنه
اگر
ParentID = ID
یا مثلا
ParentID = 0
نشون میده که این شاخه اصلیه



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


آیا میشه که برای یک فیلد در یک جدول یک زیر فیلد !! ثبت کرد ؟
منظورم از زیر فیلد توی عکس زیر مشخصه :
من مطمئن نیستم که منظورت رو فهمیده باشم . ولی اگر درست متوجه شده باشم ، این دقیقا همون کاری هست که نباید بکنی . دلیلش هم در پست شماره 3 گفتم به این لینک هم نگاه کنی بهتر متوجه میشی :
http://databases.about.com/od/specificproducts/a/normalization.htm


به نظر من :
با همون ساختار درختی کار کنی بهتره . یعنی گروه ها و زیر گروه ها در یک جدول که با ID و ParentID شاخه ها مشخص میشن .

Mahmood_M
شنبه 29 مهر 1385, 17:19 عصر
سلام
ممنونم ...
ولی راستش در مورد این ParentID و ID خوب متوجه نشدم منظورتون چیه ؟
اگه یه خورده بیشتر توضیح بدید ممنون می شم ...
یه سئوال دیگه :
در این صورت آیا تمام رکوردهای من توی یک جدول ثبت می شن ؟ ! اگه این طوره پس چه طور می تونم اونها رو به صورت گروهی نشون بدم ؟ !!
مطمئنا من منظورتون رو خوب متوجه نشدم ...
اگه یه توضیح مختصری بدید ممنون می شم ...
با تشکر ...

Mahyaa
یک شنبه 30 مهر 1385, 11:12 صبح
سلام

منظور از ID و ParentID دقیقا یک ساخار درختی است که در مثال شما ظاهرا فقط شامل دو سطح خواهد بود .
یک سطح به عنوان گروههای اصلی به عنوان نود های پدر و سطح دیگر هم همان زیر گروه هاست . (اگر قرار باشه برای هر زیر گروه هم زیر گروه هایی تعریف بشه , اون موقع طبیعتا بیش از دو سطح هست)

فرض میکنیم دو گروه اصلی داریم : 1-علمی 2-داستانی
هر گروه شمال زیر گروههای زیر هستش :
علمی : ریاضی ، کامپیوتر ، نجوم
داستانی : جنایی ، تاریخی
محتوای جدول گروه ها به این شکل میشه :

----------------------------

Name , ParentID , ID
----------------------------
1 , 1 , علمی
2 , 2 , داستانی
3 , 1 , ریاضی
4 , 1 , نجوم
5 , 1 , کامپیوتر
6 , 2 , جنایی
7 , 2 , تاریخی

حتما میدونی که جدولی که در اون اطلاعات کتابها رو نگهداری میکنی شامل فیلدی میشه که ID این جدول رو به عنوان کلید خارجی خودش نگهداری میکنه.
با یک کوئری میتونی تمام کتابهای زیر گروه های مثلا "علمی" رو نمایش بدی .

حالا برای نمایش گروه ها بصورت درختی هم هم میتونی از کامپوننت های مختلفی که وجود داره استفاده کنی مثل dxDBTreeView که DevExpress داره .
از TTreeView هم میشه استفاده کرد قبلا مثالش اومده.

راجع به Relational Database چند تا مطلب بخونی و مثال بررسی کنی ، خیلی مفیده .
کل مسائل مشابه این برات جا می افته :)

Mahyaa
یک شنبه 30 مهر 1385, 11:26 صبح
اینجا مثالهایی از مدلها داره که میتونه مفید باشه : (یک مثال هم برای book Collection داره)
http://www.databasedev.co.uk/data_models.html


اینم یک مقاله است در مورد Relational Database :
http://www.databasejournal.com/sqletc/article.php/1469521

Mahmood_M
یک شنبه 30 مهر 1385, 14:39 عصر
سلام
واقعا ازتون ممنونم ...
الان دیگه متوجه شدم ...
اگه بازم به مشکل بر خوردم مطرح می کنم ...
درضمن : Book Collection خیلی مفید بود ...
با تشکر ...
موفق باشید ...