برگزیده های پرشین تولز

طراحی بانک اطلاعاتی مقالات و موضوعات آن

niterider

Registered User
تاریخ عضویت
27 دسامبر 2002
نوشته‌ها
414
لایک‌ها
3
محل سکونت
The Most Beautifull Love , Tehran
سلام.
من می خوام با SQLserver بانک اطلاعاتی مقالاتی رو طراحی کنم که هر مقاله جذ موضوع یا موضوعاتی هست. با درست کردن یه جدول برای مقالات و یه جدول برای category ها این مسئله حل شده اما فقط برای حالتی که هر مقاله فقط یک موضوع داشته باشه. چیکار باید بکنم که بتونه تو چندتا دسته قرار بگیره؟
 

mosyhey1

Registered User
تاریخ عضویت
27 جولای 2005
نوشته‌ها
225
لایک‌ها
4
مثلاً 5 تا مقاله با id های 1، 2، 3، 4 و 5 داریم و همچنین مثلاً سه رسته a و b و c.

به نظر من راه درست این است که یک جدول دیگر نیز درست کنید که مقالات را به رسته ها بپیونداند:
جدول articletocategory:
کد:
[B]articeID[/B]		[B]categoryNAME[/B]
---------------------------------------
1			c
2			a
2			c
3			b
4			c
4			b
4			a
5			a

البته می توان در همان جدول مقالات در فیلد مربوط به رسته ها، رسته های مختلفی را با یک جدا ساز پشت سر هم نوشت و با برنامه نویسی آنها را استخراج کرد. البته این روش زیاد درست نیست و مشکل تر است، به ویژه هنگامی که می خواهید مقالات در یک رسته را ردیف کنید.
جدول article:
کد:
[B]ID[/B]	[B]tite[/B]		[B]category[/B]	[B]...[/B]
-----------------------------------------------
1	paper1		c		...
2	paper2		a,c		...
3	paper3		b		...
4	paper4		c,b,a		...
5	paper5		a		...
 

niterider

Registered User
تاریخ عضویت
27 دسامبر 2002
نوشته‌ها
414
لایک‌ها
3
محل سکونت
The Most Beautifull Love , Tehran
ببخشید دقیقا متوجه نشدم که باید چی کار کرد.
روش دومی که گفتید به دلیل همان ایرادی که خودتون گرفتین مشکل من رو حل نمی کنه.
من الان یه جدول مقاله دارم و یه جدول برای دسته ها. چه جوری کاری کنم که یه مقاله مثلا دو دسته داشته داشته باشه
 

mosyhey1

Registered User
تاریخ عضویت
27 جولای 2005
نوشته‌ها
225
لایک‌ها
4
اگر منظورتان از "یه مقاله مثلا دو دسته داشته باشه" این است که یک مثلاً یک مقاله در دو رسته آید مثلاً یک مقاله هم در فهرست مقالات معماری بیاید و هم در فهرست مقالات تاریخ به نظر من بایستی همانطور که مثال زدم یک جدول دیگر به نام مثلاً جدول articletocategory درست کنید که یک فیلد به نام مثلاً articeID برای ذخیره شناسه مقاله و یک فیلد به نام مثلاً categoryNAME برای شناسه رسته ها داشته باشد.

آنگاه هر مقاله ای که دارید را به تعداد رسته هایی که در آن قرار می گیرد یک رکورد به این جدول بیفزایید که مثلاً در یک رکورد بگویید مقاله 2 در رسته a است و همچنین در رکورد دیگری بگویید مقاله 2 در رسته c است. در این صورت مقاله دو در هر دو رسته قرار گرفته است. با برنامه نویسی هرگاه فهرست مقالات رسته a یا c را ردیف کنید مقالات در هر دوی این رسته ها هستند.

با این کار هر مقاله می تواند در هر چند تعداد رسته باشد و همچنین در هر رسته هر تعداد مقاله می تواند باشد و به راحتی هر کدام قابل شمارش و ویرایش است.
 

niterider

Registered User
تاریخ عضویت
27 دسامبر 2002
نوشته‌ها
414
لایک‌ها
3
محل سکونت
The Most Beautifull Love , Tehran
فکر نمی کنم این روش شدنی باشه. اولا ID و نمیشه دوبار تو جدول تکرار کرد. در ثاتی اینجوری همه این اطلاعات باید چندین بار تو جدول تکرار بشه و از نظر بهینه بودن اصلا به صرفه نیست.
مطلب آخر اینکه اگه بخوایم این رو تو یه جدول نمایش بدیم ، عنوان مقاله و جزئیاتش چندین بار تکرار میشه با این تفاوت که هر بار مربوط به یه category شده. باید راه بهتری هم باشه
 

mosyhey1

Registered User
تاریخ عضویت
27 جولای 2005
نوشته‌ها
225
لایک‌ها
4
سلام. حتماً روش های بهتری هم هستند و من نمی گویم این روش بهترین است؛ ولی این دو راهی هم که من گفتم شدنی است که راه دومی بسیار اصولی تر است.

اولا ID و نمیشه دوبار تو جدول تکرار کرد.

در جدول articletocategory که گفتم فیلد کلیدی (ID مد نظر شما) نه articeID است و نه categoryNAME؛ و فیلد کلیدی که نبایستی تکراری باشد مثلاً با نام ID است که نوشته نشده است.

اینجوری همه این اطلاعات باید چندین بار تو جدول تکرار بشه.
مطلب آخر اینکه اگه بخوایم این رو تو یه جدول نمایش بدیم ، عنوان مقاله و جزئیاتش چندین بار تکرار میشه

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

در این روش سه جدول داریم؛ یکی جدول مقالات، یکی جدول رسته ها و سومی جدول رابط مقالات و رسته ها. در این روش به راحتی می توان فهرست ID مقالاتی که مثلاً در رسته c است را به دست آورد. همچنین می توان به راحتی فهمید یک مقاله در چه رسته هایی آمده است.

در این آدرس هم مقاله خوبی در این زمینه جداول مرتبط قرار دارد:
 

niterider

Registered User
تاریخ عضویت
27 دسامبر 2002
نوشته‌ها
414
لایک‌ها
3
محل سکونت
The Most Beautifull Love , Tehran
ممنونم با این چیزایی که گفتین طراحی دیتابیس حل شد.
سول بعدی اینه که چه جور کوئری باید نوشته بشه تا مثلا لیست مقالات گرفته بشه بدون تکرار مقالات و فقط جلوی مقالات کتگوری های مختلفش آورده بشه؟
 

niterider

Registered User
تاریخ عضویت
27 دسامبر 2002
نوشته‌ها
414
لایک‌ها
3
محل سکونت
The Most Beautifull Love , Tehran
روالی نوشتم که بتونم مقالات و کتگوری هاش رو بازیابی کنم. می خوام توی صفحه وب به این شکل مثلا نمایش بدم :

- مقاله الف : cat a و cat b
- مقاله ب : cat c
- مقاله ج : cat d و cat a و catc

این روالیه که نوشتم
کد:
CREATE PROCEDURE [dbo].[GetArticleList]
AS
    SELECT  Knowledge.Title, 
            Knowledge.ArticleID, 
            Category.Title,
            Category.CategoryID, 
            CategoryKnowledge.CategoryID,
            CategoryKnowledge.ArticleID
    FROM    Category INNER JOIN
            CategoryKnowledge ON Category.CategoryID = CategoryKnowledge.CategoryID INNER JOIN
            Knowledge ON CategoryKnowledge.ArticleID = Knowledge.ArticleID

اما الان به این شکل نمایش داده میشه راه حل چیه؟

- مقاله الف : cat a
- مقاله الف : cat b
- مقاله ب : cat c
- مقاله ج : cat d
- مقاله ج : catc
- مقاله ج : cat a
 
بالا