2014-03-06 104 views
0

我試圖創建組件的層次結構,FX:SQL層次結構獨特

CREATE TABLE COMPONENTS(id, name, price, component_type) 

CREATE TABLE SUB_COMPONENTS_1(...) 

CREATE TABLE SUB_COMPONENTS_2(...) 

凡SUB_COMPONENTS表使用超類型的ID列作爲外鍵,和他們得到「填充」取決於什麼component_type它是。 (即COMPONENT_TYPE列)

我一直努力遵循: http://bytes.com/topic/sql-server/answers/808389-design-question-type-heirarchy-supertype-queries 但不能讓我的頭左右,他如何能「汽車類型」獨特的,能夠在車輛表中創建多個條目相同的「vehicle_type」?

任何幫助理解這一點,將不勝感激!

更新時間:

關係模式的沒有關係,是關於至於我來:

組件(COMPONENT_ID:串口,名稱:字符串類型:字符串,價格:雙)

輪(wheel_id = COMPONENT_ID,類型:字符串,價格= component_price)

電機(motor_id = COMPONENT_ID,類型:字符串,價格= component_price)

汽車(名稱:string,total_price,wheels = component_id,motor = component_id ....)

+1

SUB_COMPONENTS_1和SUB_COMPONENTS_2的模式是什麼? – Rahul

回答

1

要回答您關於瞭解發佈的鏈接中發生的問題的問題,該示例並不是說vehicle_type是唯一的,它是說,組合vinvehicle_type是唯一的。該示例將這兩列的組合用作關鍵字。不過,我會建議使用顯式的ID爲關鍵詞(例如ComponentID將是對Components表的主鍵,並在每個子表的外鍵)。事情是這樣的:

CREATE TABLE Components 
(
    ComponentID int identity(1,1) not null, 
    // Other columns here 
    CONSTRAINT [PK_ComponentID] PRIMARY KEY CLUSTERED 
    (
     [ComponentID] ASC 
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
    ) ON [PRIMARY] 
) 

CREATE TABLE SubComponents1 
(
    SubComponent1ID int identity(1,1) not null, 
    ComponentID int not null, 
    // Other columns here 
    CONSTRAINT [PK_SubComponent1ID] PRIMARY KEY CLUSTERED 
    (
     [SubComponent1ID] 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 

ALTER TABLE SubComponents1 WITH NOCHECK ADD CONSTRAINT [FK_SubComponents1_Components] FOREIGN KEY(ComponentID) 
REFERENCES Components (ComponentID) 
GO 

ALTER TABLE SubComponents1 CHECK CONSTRAINT [FK_SubComponents1_Components] 
GO 

我會ammend這個答案如果您可以更好地解釋您的問題(特別是您的問題表)(包括您的子表格的模式),請提供更多與您的問題有關的詳細信息。

+0

正是我需要'搗鼓'我的項目! 你已經發布了一些高級但非常有用的代碼,只是問題是我是初學者,只理解SQL的基礎知識。太愛看上面寫的,儘可能簡單! 也許我可能會補充說我在postgressql中這樣做 - 如果這有什麼區別? 還沒有了解'身份',打算使用串行數據類型,有什麼區別? 我也沒有學過'CLUSTERED','ASC',只有'CHECK'上的基礎知識。 更新的原始帖子 –

+1

這是SQL服務器代碼 - 您帖子上的標籤表示您正在使用SQL服務器。 'ASC'代表升序,只是爲了訂購。 'CLUSTERED'與索引有關,如果你願意,你可以忽略它。即使你不使用SQL服務器,這個概念仍然是一樣的 - 使你的子組件的外鍵指向你的組件的主鍵。主鍵標識當前表中的行,外鍵標識與另一個表中的行的關係。每個表都應該有一個主鍵。 – mayabelle

+0

具有「父級」(即組件是每個子組件表的父級)的表應具有引用父級表的外鍵。 – mayabelle

1

要做到這一點,你只需要兩個表

CREATE TABLE組件(ID,COM​​PONENT_TYPE)
CREATE TABLE SUB_COMPONENTS(S_ID,名稱,價格)

  ID   COMPONENT_TYPE
MIG
SU

 
SUB_COMPONENT contains s_id as foreign key So the table values will be 

MIG   $ 30
MIG-15   $ 20
MIG-17   $ 30
SU-25   $ 30
SU-25   $ 20

您可以加入與價格sub_Components表需要儘可能多的亞型。 您可以使用此查詢
SELECT * FROM SUB_COMPONENTS其中S_ID = 1(米格型或2型SU)得到的結果
或加入按名稱表和順序你得到的層次結構列表。


根據我的理解,我希望這會回答你的問題。