# پایگاه‌های داده > SQL Server > T-SQL >  ساختار جداول قطعات سیستم

## fakhravari

با سلام
دوستان یه نظر بدین برای درست کردن مثلا این برنامه چه جداولی نیاز است.

برنامه من ثبت اطلاعات سیستم است.

مثال

مادربورد  - گیگابایت - مدل x

Ram king ddr2 2 gb

manitor Lg flat 17

و شاید مثلا برای ما مهم نباشه 
کار شبکه مدل و ظرفیت چقدره
مثلا باشه

کارت شبکه موجود

یا شاید مدل نداشته باشه مثل : پاور 450w

----------


## alireza_s_84

> با سلام
> دوستان یه نظر بدین برای درست کردن مثلا این برنامه چه جداولی نیاز است.
> 
> برنامه من ثبت اطلاعات سیستم است.
> 
> مثال
> 
> مادربورد  - گیگابایت - مدل x
> 
> ...


دو راه برای اینکار وجود داره.
اگر میزان ستونهایی که مقدار اونها null میمونه از اونهایی که مقدار میگیرن کمتر باشه بهتره که خصیصه ها به صورت ستون تعرفی کنید و هرجایی لازم نبود مقدار ندین.
راه دوم معمولا زمانی استفاده میشه که شما تعداد ستونهای زیادی رو بدون مقدار رها میکنید و اینطوری فضای null زیادی توی جدول وجود خواهد داشت. راه دوم استفاده از یک جدول واسط با سه ستون هست:
1- آیدی خصیصه (ویژگی)  
2- ستون مقدار
3- آیدی قطعه
بعد شما یک جدول برای خصیصه ها خواهید داشت با دو ستون:
1- آیدی خصیصه
2- نام خصیصه
کلیدهای خارجی هم که فکر میکنم مشخص باشه

----------


## fakhravari

با مثال بهتر جا می افتاد

----------


## alireza_s_84

> با مثال بهتر جا می افتاد


2.png

Untitled.jpg

3.png

----------


## fakhravari

جدول Piece توضیح میدین.

----------


## alireza_s_84

> جدول Piece توضیح میدین.


جدول اصلی نگهداری قطعات میشه. میتونه شامل یک ستون دیگه باشه بنام ModelId که کلید خارجی داشته باشه به جدولی با ستون های زیر:
1- modelId
2-Brands
برای مثال هنگام افزودن یک قطعه جدید:
Ram 2G DDR3 Kingmax
Ram از جدول نوع قطعه میاد 
2G از جدول خصیصه ها میاد (Size)
DDR3 از جدول خصیصه ها (Technology)
Kingmax هم از جدول مدل 
در واقع هنگام افزودن قطعه فوق ما ابتدا به جدول قطعه شناسه ی رم رو به جدول قطعات اضافه میکنیم در اینجا 1 و مدل قطعه که از جدول مدل میاد
سپس به جدول خصیصه ها دو تا  رکورد اضافه میکنیم رکورد اول برای شناسه قطعه و سایز و رکورد دوم برای شناسه قطعه و تکنولوژی 
در واقع ما فقط دوتا خصیصه رو برای رم مقدار دهی میکنیم.

----------


## fakhravari

چطوری بتونیم یک متن کنیم مثلاما رم یک بار ثبت میکنیم با ظرفیت 1 گیگبعد چطوری نام سازنده بدیم؟

----------


## fakhravari

علی رضا زحمتت دادم ممنونم ازت.میشه ساختار جداول بدی همراه با داده تستی با یه query من نگرفتم چطوری رشته Ram 2G DDR3 Kingmax بسازیhttps://barnamenevis.org/images/smilies/yahoo/114.gif

----------


## fakhravari

خروجیhttp://www.pic.tooptarinha.com/image...d11xhef9e1.png

----------


## fakhravari

داش علی شما نمونت ضمیمه کن مرسی.
خودم یه چیزی سر هم کردم خروجی درست میده اما روش حساب نمیکنم یکمی ناهماهنگ اما خروجی خوب میده
CREATE TABLE [dbo].[Constructor](	[ID] [int] IDENTITY(1,1) NOT NULL,
	[ConstructorName] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Constructor] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Constructor] ON
INSERT [dbo].[Constructor] ([ID], [ConstructorName]) VALUES (1, N'Intel')
INSERT [dbo].[Constructor] ([ID], [ConstructorName]) VALUES (2, N'Gigabyte')
INSERT [dbo].[Constructor] ([ID], [ConstructorName]) VALUES (3, N'Asus')
INSERT [dbo].[Constructor] ([ID], [ConstructorName]) VALUES (4, N'King Mastor')
INSERT [dbo].[Constructor] ([ID], [ConstructorName]) VALUES (5, N'AMD')
INSERT [dbo].[Constructor] ([ID], [ConstructorName]) VALUES (6, N'LG')
INSERT [dbo].[Constructor] ([ID], [ConstructorName]) VALUES (7, N'Samsoung')
INSERT [dbo].[Constructor] ([ID], [ConstructorName]) VALUES (8, N'NVIDIA')
SET IDENTITY_INSERT [dbo].[Constructor] OFF
/****** Object:  Table [dbo].[Section]    Script Date: 06/16/2014 21:53:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Section](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[SectionName] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Section] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Section] ON
INSERT [dbo].[Section] ([ID], [SectionName]) VALUES (1, N'MB')
INSERT [dbo].[Section] ([ID], [SectionName]) VALUES (2, N'VGA')
INSERT [dbo].[Section] ([ID], [SectionName]) VALUES (3, N'CPU')
INSERT [dbo].[Section] ([ID], [SectionName]) VALUES (4, N'RAM')
INSERT [dbo].[Section] ([ID], [SectionName]) VALUES (5, N'Sound Card')
INSERT [dbo].[Section] ([ID], [SectionName]) VALUES (6, N'LAN')
INSERT [dbo].[Section] ([ID], [SectionName]) VALUES (7, N'Manitor')
INSERT [dbo].[Section] ([ID], [SectionName]) VALUES (8, N'HDD')
SET IDENTITY_INSERT [dbo].[Section] OFF
/****** Object:  Table [dbo].[Model]    Script Date: 06/16/2014 21:53:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Model](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[SectionID] [int] NOT NULL,
	[ModelName] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Model] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Model] ON
INSERT [dbo].[Model] ([ID], [SectionID], [ModelName]) VALUES (1, 4, N'DDR')
INSERT [dbo].[Model] ([ID], [SectionID], [ModelName]) VALUES (2, 4, N'DDR2')
INSERT [dbo].[Model] ([ID], [SectionID], [ModelName]) VALUES (3, 4, N'Normal')
INSERT [dbo].[Model] ([ID], [SectionID], [ModelName]) VALUES (4, 5, N'Relatek')
INSERT [dbo].[Model] ([ID], [SectionID], [ModelName]) VALUES (5, 5, N'Onboard')
INSERT [dbo].[Model] ([ID], [SectionID], [ModelName]) VALUES (6, 6, N'دارد')
INSERT [dbo].[Model] ([ID], [SectionID], [ModelName]) VALUES (7, 3, N'Core i7')
INSERT [dbo].[Model] ([ID], [SectionID], [ModelName]) VALUES (8, 7, N'Flatron')
INSERT [dbo].[Model] ([ID], [SectionID], [ModelName]) VALUES (9, 1, N'X M.B')
INSERT [dbo].[Model] ([ID], [SectionID], [ModelName]) VALUES (10, 2, N'GeForce GTS 450')
SET IDENTITY_INSERT [dbo].[Model] OFF
/****** Object:  Table [dbo].[Capacity]    Script Date: 06/16/2014 21:53:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Capacity](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[SectionID] [int] NOT NULL,
	[CapacityName] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Capacity] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[Capacity] ON
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (1, 3, N'2.2')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (2, 7, N'17')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (3, 7, N'14')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (4, 4, N'128 MB')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (5, 4, N'256 MB')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (6, 4, N'512 MB')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (7, 4, N'1 GB')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (8, 3, N'2.5')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (9, 3, N'2')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (10, 8, N'300 GB')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (11, 2, N'1 GB')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (13, 2, N'128 MB')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (14, 2, N'256 MB')
INSERT [dbo].[Capacity] ([ID], [SectionID], [CapacityName]) VALUES (15, 2, N'512 MB')
SET IDENTITY_INSERT [dbo].[Capacity] OFF
/****** Object:  Table [dbo].[System]    Script Date: 06/16/2014 21:53:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[System](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[ModelID] [int] NULL,
	[ConstructorID] [int] NULL,
	[CapacityID] [int] NULL,
	[SysID] [nvarchar](10) NOT NULL,
 CONSTRAINT [PK_System] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[System] ON
INSERT [dbo].[System] ([ID], [ModelID], [ConstructorID], [CapacityID], [SysID]) VALUES (1, 2, 1, 7, N'SYS001')
INSERT [dbo].[System] ([ID], [ModelID], [ConstructorID], [CapacityID], [SysID]) VALUES (2, 6, NULL, NULL, N'SYS001')
INSERT [dbo].[System] ([ID], [ModelID], [ConstructorID], [CapacityID], [SysID]) VALUES (5, 7, 5, 8, N'SYS001')
INSERT [dbo].[System] ([ID], [ModelID], [ConstructorID], [CapacityID], [SysID]) VALUES (6, 9, 2, NULL, N'SYS001')
INSERT [dbo].[System] ([ID], [ModelID], [ConstructorID], [CapacityID], [SysID]) VALUES (7, NULL, 4, 10, N'SYS001')
INSERT [dbo].[System] ([ID], [ModelID], [ConstructorID], [CapacityID], [SysID]) VALUES (8, 10, 8, 15, N'SYS001')
SET IDENTITY_INSERT [dbo].[System] OFF
/****** Object:  View [dbo].[View_2]    Script Date: 06/16/2014 21:53:24 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE VIEW [dbo].[View_2]
AS
SELECT     TOP (100) PERCENT SectionName, ConstructorName, ModelName, CapacityName, SysID, ID
FROM         (SELECT     dbo.Section.SectionName, dbo.Constructor.ConstructorName, dbo.Model.ModelName, Capacity_1.CapacityName, dbo.System.SysID, dbo.System.ID
                        FROM         dbo.Model INNER JOIN
                                              dbo.Section ON dbo.Model.SectionID = dbo.Section.ID INNER JOIN
                                              dbo.System ON dbo.Model.ID = dbo.System.ModelID LEFT OUTER JOIN
                                              dbo.Capacity AS Capacity_1 ON Capacity_1.ID = dbo.System.CapacityID AND Capacity_1.SectionID = dbo.Section.ID LEFT OUTER JOIN
                                              dbo.Constructor ON dbo.System.ConstructorID = dbo.Constructor.ID
                        UNION
                        SELECT     Section_2.SectionName, Constructor_2.ConstructorName, '' AS ModelName, Capacity_1.CapacityName, System_2.SysID, System_2.ID
                        FROM         dbo.Capacity AS Capacity_1 INNER JOIN
                                              dbo.Section AS Section_2 ON Capacity_1.SectionID = Section_2.ID RIGHT OUTER JOIN
                                              dbo.System AS System_2 ON Capacity_1.ID = System_2.CapacityID LEFT OUTER JOIN
                                              dbo.Constructor AS Constructor_2 ON System_2.ConstructorID = Constructor_2.ID
                        WHERE     (System_2.ID NOT IN
                                                  (SELECT     System_1.ID
                                                     FROM         dbo.Model AS Model_1 INNER JOIN
                                                                           dbo.Section AS Section_1 ON Model_1.SectionID = Section_1.ID INNER JOIN
                                                                           dbo.System AS System_1 ON Model_1.ID = System_1.ModelID LEFT OUTER JOIN
                                                                           dbo.Capacity AS Capacity_1 ON Capacity_1.ID = System_1.CapacityID AND Capacity_1.SectionID = Section_1.ID LEFT OUTER JOIN
                                                                           dbo.Constructor AS Constructor_1 ON System_1.ConstructorID = Constructor_1.ID))) AS U
ORDER BY SectionName

----------


## alireza_s_84

> خروجیhttp://www.pic.tooptarinha.com/image...d11xhef9e1.png


این کوئری رو اجرا کنید تا نتیجه رو ببینید:
SELECT  Piece.PieceId, PieceType.Name,b.TitleFROM     Piece INNER JOIN
               PieceType ON Piece.PieceType = PieceType.PieceTypeId
			   left outer join
			   (Select f2.PieceId,  Stuff(
(SELECT     N'/' + CONVERT(Varchar, Value) 
FROM         PieceFeatures as f1
where f1.PieceId=f2.PieceId  FOR XML PATH(''),TYPE )
.value('text()[1]','nvarchar(max)'),1,1,N'')AS Title
From PieceFeatures as f2 group by PieceId) as b on b.PieceId = Piece.PieceId

میتونید از تابع Stuff برای سرهم کردن ستون ها استفاده کنید. اگر نیازمند کوئری های پیچیده تر هستین میتونید در مورد این تابع بیشتر جستجو کنید.

----------


## fakhravari

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

----------


## alireza_s_84

> سلام
> داش علی اسکریپت جداول با داده هاش میزاری


http://Trainbit.com/files/2006191884/db.rar

----------


## fakhravari

داش علی این جدول Piece اضافی نیست :متفکر: 
کاربردش نفهمیدم Piece

----------


## alireza_s_84

> داش علی این جدول Piece اضافی نیست
> کاربردش نفهمیدم Piece


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

----------


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

بسم الله الرحمن الرحیم



> بعد شما یک جدول برای خصیصه ها خواهید داشت با دو ستون:
> 1- آیدی خصیصه
> 2- نام خصیصه


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

----------


## fakhravari

به نظر من ساختار خوبی داره مهدی
--------------------
داش علی یه سوال

1) برای هر قطعه پس باید در Piece ایدی اون وارد بشه؟ در عکس بالا 2 بار رم با مشخصات مختلف داده شده حال برای ویرایش رم 1 باید چطوری داده ها را واکشی کرد؟

----------


## alireza_s_84

> به نظر من ساختار خوبی داره مهدی
> --------------------
> داش علی یه سوال
> 
> 1) برای هر قطعه پس باید در Piece ایدی اون وارد بشه؟ در عکس بالا 2 بار رم با مشخصات مختلف داده شده حال برای ویرایش رم 1 باید چطوری داده ها را واکشی کرد؟


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

----------


## alireza_s_84

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


لطفا نمودار جداول و ارتباطات بین اونها رو قرار بدین تا بهتر بتونیم بحث کنیم!!!

----------


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

بسم الله الرحمن الرحیم



> لطفا نمودار جداول و ارتباطات بین اونها رو قرار بدین تا بهتر بتونیم بحث کنیم!!!


با سلام
به نظرم هر کدوم از اجزای کامپیوتر که 1- لازم است اطلاعاتی راجع بهش ثبت شود و 2- دارای مشخصات متفاوتی می باشند؛ کلاس های مجزایی هستند.
بنابراین می توان بنا به نیاز سیستم هارد و مین و رم و ... رو کلاس های مجزایی در نظر گرفت که هر کدام ویژگی های خودشون رو دارند.
مادربورد  - گیگابایت - مدل x : سایز، مدل

: Ram king ddr2 2 gb : مدل، تکنولوژی و سایز

ناگفته نمونه که در پیاده سازی این کلاس ها از وراثت استفاده میشود ولی با توجه به اینکه وراثت در SQL پشتیبانی نمی شود؛ فکر نمیکنم چاره ای داشته باشد.
موفق باشید.

----------


## fakhravari

با سلام
یه فیلد Sorttinyintبرای مرتب سازی مثلا
 H.D.D  20 GB/Maxtor/Sata

 H.D.D  Sata   Maxtor  20 GB

و یه فیلد ID برای جدول PieceFeatures

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

این [Features].Sort 
سورت چطوری اعمال کنم؟

----------


## alireza_s_84

> با سلام
> یه فیلد Sorttinyintبرای مرتب سازی مثلا
>  H.D.D  20 GB/Maxtor/Sata
> 
>  H.D.D  Sata   Maxtor  20 GB
> 
> و یه فیلد ID برای جدول PieceFeatures
> 
> -------------------
> ...


متوجه منظورت نشدم!!!

----------


## fakhravari

مثلا چینش _Features بر اساس یک فیلد باشه
_FeatureId    int    
Name    nvarchar(50)    
*Sort    tinyint    
*

----------


## alireza_s_84

> مثلا چینش _Features بر اساس یک فیلد باشه
> _FeatureId    int    
> Name    nvarchar(50)    
> *Sort    tinyint    
> *


Order By رو واسه همین گذاشتن دیگه. شما بر اساس هر ستونی که دوست داشته باشین ، نتیجه رو با این عبارت مرتب کنید.

----------


## fakhravari

خب اره ولی نمیدونم کجای query بزارمش

----------


## fakhravari

alireza_s_84  منتظرم

----------


## fakhravari

دوستان یه کمکی نمی کنید ،
داش علی نیست.
در مورد مرتب سازی بر اساس sort که گفته بودم.

----------


## fakhravari

دوستان نمیخوام تاپیک اضافی زده بشه.
کمکی کنید....

----------


## fakhravari

دوستان ج نگرفتم

----------

