2014-03-06 105 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)得到的结果
或加入按名称表和顺序你得到的层次结构列表。


根据我的理解,我希望这会回答你的问题。