【问题标题】:SQL Hierarchy uniqueSQL 层次结构唯一
【发布时间】:2014-03-06 17:09:56
【问题描述】:

我正在尝试创建组件的层次结构,fx。:

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”唯一,并能够在车辆表中创建具有相同“vehicle_type”的多个条目?

任何帮助理解这一点,将不胜感激!

更新:

就我而言,没有关系的关系模式是这样的:

组件(component_id:序列号,名称:字符串,类型:字符串,价格:double)

Wheels(wheel_id=component_id, kind: string, price=component_price)

电机(motor_id=component_id, kind: string, price=component_price)

汽车(名称:字符串,total_price,wheels=component_id,motor=component_id....)

【问题讨论】:

  • SUB_COMPONENTS_1 和 SUB_COMPONENTS_2 的架构是什么?

标签: sql sql-server hierarchy


【解决方案1】:

为了回答您关于了解您发布的链接中发生了什么的问题,该示例并不是说 vehicle_type 是唯一的,而是说 vin 和 @987654323 的组合 @ 是独特的。该示例使用这两列的组合作为键。但是,我建议使用显式 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

如果您可以更好地解释您的问题(以及您的子表的架构),我将修改此答案以包含与您的问题有关的更多详细信息。

【讨论】:

  • 正是我需要“摆弄”我的项目的东西!您发布了一些在我看来是高级但非常有用的代码,唯一的问题是我是初学者,只了解 SQL 的基础知识。也希望看到上面写的,尽可能简单!也许我可以补充一点,我在 postgressql 中这样做 - 如果这有什么不同?还没学过“身份”,本来打算用串行数据类型的,有什么区别吗?我也没有了解“CLUSTERED”、“ASC”,只了解了“CHECK”的基础知识更新了原帖
  • 这是 SQL Server 代码 - 您帖子上的标签表明您正在使用 SQL Server。 ASC 代表升序,仅用于排序。 CLUSTERED 与索引有关,如果您愿意,可以省略它。即使您不使用 SQL Server,概念仍然相同 - 使 Subcomponents 上的外键指向 Components 的主键。主键标识当前表中的行,外键标识与另一个表中的行的关系。您的每个表都应该有一个主键。
  • 具有“父”(即组件是每个子组件表的父)的表应该有一个引用父表的外键。
【解决方案2】:

要实现这一点,您只需要两个表

创建表组件(id,component_type)
CREATE TABLE SUB_COMPONENTS(s_id, name, Price)

ID   Component_Type
1   米格
2   苏

SUB_COMPONENT 包含 s_id 作为外键所以表值将是

  1   MIG   $30
1   MIG-15   $20
1   MIG-17   $30
2   SU-25   $30
2   SU-25   20 美元

您可以在带有价格的 sub_Components 表中包含任意数量的子类型。 您可以使用此查询获得结果
SELECT * FROM SUB_COMPONENTS where s_id = 1(对于 MIG 类型或 2 对于 SU 类型)
或者加入表格并按名称排序您将获得层次结构中的列表。


据我了解,我希望这能回答您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2011-08-27
    • 2020-11-30
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多