# پایگاه‌های داده > SQL Server > T-SQL > تحلیل و طراحی بانک اطلاعات >  پیاده سازی ارث بری درSQL

## hoshicameron

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

CREATE TABLE Vehicles
 (vin CHAR(17) NOT NULL PRIMARY KEY,
 vehicle_type CHAR(3) NOT NULL
 CHECK(vehicle_type IN ('SUV', 'SED')),
 UNIQUE (vin, vehicle_type),
 ..);

CREATE TABLE SUV
 (vin CHAR(17) NOT NULL PRIMARY KEY,
 vehicle_type CHAR(3) DEFAULT 'SUV' NOT NULL
 CHECK(vehicle_type = 'SUV'),
 UNIQUE (vin, vehicle_type),
 FOREIGN KEY (vin, vehicle_type)
 REFERENCES Vehicles(vin, vehicle_type)
 ON UPDATE CASCADE
 ON DELETE CASCADE,
 ..);

 CREATE TABLE Sedans
 (vin CHAR(17) NOT NULL PRIMARY KEY,
 vehicle_type CHAR(3) DEFAULT 'SED' NOT NULL
 CHECK(vehicle_type = 'SED'),
 UNIQUE (vin, vehicle_type),
 FOREIGN KEY (vin, vehicle_type)
 REFERENCES Vehicles(vin, vehicle_type)
 ON UPDATE CASCADE
 ON DELETE CASCADE,
 ..);

I can continue to build a hierarchy like this. For example, if I had
 a Sedans table that broke down into two-door and four-door sedans, I
 could a schema like this:

 CREATE TABLE Sedans
 (vin CHAR(17) NOT NULL PRIMARY KEY,
 vehicle_type CHAR(3) DEFAULT 'SED' NOT NULL
 CHECK(vehicle_type IN ('2DR', '4DR', 'SED')),
 UNIQUE (vin, vehicle_type),
 FOREIGN KEY (vin, vehicle_type)
 REFERENCES Vehicles(vin, vehicle_type)
 ON UPDATE CASCADE
 ON DELETE CASCADE,
 ..);

 CREATE TABLE TwoDoor
 (vin CHAR(17) NOT NULL PRIMARY KEY,
 vehicle_type CHAR(3) DEFAULT '2DR' NOT NULL
 CHECK(vehicle_type = '2DR'),
 UNIQUE (vin, vehicle_type),
 FOREIGN KEY (vin, vehicle_type)
 REFERENCES Sedans(vin, vehicle_type)
 ON UPDATE CASCADE
 ON DELETE CASCADE,
 ..);

 CREATE TABLE FourDoor
 (vin CHAR(17) NOT NULL PRIMARY KEY,
 vehicle_type CHAR(3) DEFAULT '4DR' NOT NULL
 CHECK(vehicle_type = '4DR'),
 UNIQUE (vin, vehicle_type),
 FOREIGN KEY (vin, vehicle_type)
 REFERENCES Sedans (vin, vehicle_type)
 ON UPDATE CASCADE
 ON DELETE CASCADE,
 ..);

تو این مثال نویسنده یه جدولی رو با نام vehicle ساخته که کلید این صفت در بقیه جداول به عنوان کلید اصلی تکرار شده . سوال من اینه که اون صفت کلید (vin) که تو جداول بعدی تکرار شده و هم کلید اصلی است و هم کلید خارجی قضیه اش چیه ؟ در ضمن اگه من بخوام به این جداول مقدار بدم چجوری باید عمل کنم . کمی تا مقداری گیجیده ام . 
مثلا اگه من بخوام این روش رو درپایگاه داده خودم پیاده سازی کنم چجوری جداول مقدار می گیرن . لطفا دستورات sql رو هم برام بنویسید ( دستورات درج و select ) . حالا اگه من بخوام یه جدول بسازم به نام طرفین قرارداد که صفات (کد و نام  و نام خانوادگی و آدرس رو داشته باشه ) و جدول پزشک (کد ( کلید خارجی ) و مدرک ) داشته باشند . من اگه بخوام پزشک جدیدی رو اضافه کنم چه کدهایی رو باید بنویسم . در ضمن بین طرفین قرارداد و بخش پذیرش بیمه هم رابطه هست . من باید برای روابط بین پزشک و بخش پذیرش ، داروخانه و بخش پذیرش و ... از یم جدول استفاده کنم یا روابط رو در چند جدول ثبت کنم . 

ببخشید که یه کم زیاد شد و سرتون رو به درد آوردم . تازه کارم دیگه . به شدت نیازمند راهنمای سبزتون هستم .

----------


## Galawij

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

----------


## مهدی هادیان2

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


یعنی می فرمائید sql ارث بری رو ساپورت می کنه؟
و من می تونم معادل کلاس های پدر، در پایگاه داده جدول داشته باشم و اون رو توسط relation به فرزندها مرتبط کنم؟
relation چگونه فرق بین رابطه معمولی بین جدول ها و رابطه اشتقاق تمایز قائل می شه؟
با تشکر

----------


## linux

> یعنی می فرمائید sql ارث بری رو ساپورت می کنه؟
> و من می تونم معادل کلاس های پدر، در پایگاه داده جدول داشته باشم و اون رو توسط relation به فرزندها مرتبط کنم؟
> relation چگونه فرق بین رابطه معمولی بین جدول ها و رابطه اشتقاق تمایز قائل می شه؟
> با تشکر


sql server شی گرایی را پشتیبانی نمی کند ولی شما می توانید با استفاده از جداول و ارتباط بین آنها ارث بری را پیاده سازید کنید ، رو ش اول
فرض کنید شی a و شی b  از شی c  ارث برده می شود یک جدول می سازید برای شی c چیزی که مهم هست 
1- فلید کلید و 2 -فیلد کمکی برای شناخت شی  می باشد، 
یک جدول می سازید برای شی b,  یکی دیگر برای شی a کلید ها جدول a,b از همان نوع کلید جدول c خواهد بود بین جدول a,c و b,c یک ارتباط یک به یک هست شما باید بر اساس دیتای خودتان در برنامه این جدول را پر کنید مثلا یک شی از نوع a دارید ، خوب یک قسمت از اطلاعات را باید در جدول c بنویسید و یک قسمت را در جدول a و بر اساس معیاری که خودتان می گذارید در جدول c فیلد کمکی که برا شناخت شی گذاشتید مقدار دهی کنید.
روش 2
جدول شی پایه را می سازید و بعد از فیلد کلید و فیلد شناسی شی  یک فیلد از نوع xml می سازید، می توانید از این فیلد برای نگهداری اطلاعات مربوط به اشیا استفاده کنید

----------


## مهدی هادیان2

> sql server شی گرایی را پشتیبانی نمی کند ولی شما می توانید با استفاده از جداول و ارتباط بین آنها ارث بری را پیاده سازید کنید ، رو ش اول
> فرض کنید شی a و شی b از شی c ارث برده می شود یک جدول می سازید برای شی c چیزی که مهم هست 
> 1- فلید کلید و 2 -فیلد کمکی برای شناخت شی می باشد، 
> یک جدول می سازید برای شی b, یکی دیگر برای شی a کلید ها جدول a,b از همان نوع کلید جدول c خواهد بود بین جدول a,c و b,c یک ارتباط یک به یک هست شما باید بر اساس دیتای خودتان در برنامه این جدول را پر کنید مثلا یک شی از نوع a دارید ، خوب یک قسمت از اطلاعات را باید در جدول c بنویسید و یک قسمت را در جدول a و بر اساس معیاری که خودتان می گذارید در جدول c فیلد کمکی که برا شناخت شی گذاشتید مقدار دهی کنید.
> روش 2
> جدول شی پایه را می سازید و بعد از فیلد کلید و فیلد شناسی شی یک فیلد از نوع xml می سازید، می توانید از این فیلد برای نگهداری اطلاعات مربوط به اشیا استفاده کنید


از راهنماییتون ممنون
راجع به روش اولتون صحبت می کنم؛ چون راجع به روش 2اطلاعاتی ندارم
با روشی که فرمودید رابطه های یک به یک زیاد می شه و نشون دهنده ضعفه
از طرفی اگه بعدا کسی بخواد از کدهای من استفاده کنه زمان زیادی می بره که بفهمه من چه جوری جدول ها رو پیاده سازی کردم این طور نیست؟

----------


## aliehmansouri

سلام و خسته نباشید
من نموداریه پایگاه داده رو طراحی کردم و دراون ازارث بری هم استفاده کردم اما الان نمیدونم که اون رابطه ارث بری رو توی جدول نشون بدم اگه میشه کمک کنید ممنون

----------

