【问题标题】:Nested tables and user defined data types in sql serversql server 中的嵌套表和用户定义的数据类型
【发布时间】:2015-06-05 15:27:04
【问题描述】:

我需要在 SQL Server 中创建嵌套表。谁能指导我如何创建它们。只是为了提供背景,我正在尝试将 RDBMS 从 oracle 移动到 SQL 服务器。

表结构如下。我有以地址作为列之一的“员工”表。我还有一张桌子,上面有 Street、Town、Dist、State 的列。当我查询“员工”表时,我应该在地址列中看到地址表中所有列的属性名称和值。

员工: 包含列:ID、FirstName、LastName、dept、gender、dob、address

地址(嵌套表): 有列:街道、城镇、地区、州

这是在 oracle 中使用嵌套表和用户定义的数据类型完成的。任何人都可以建议我在 SQL Server 中有什么替代方法。如何在 SQL Server 中实现此要求。

【问题讨论】:

  • 为什么它在单独的表中?一个员工可以有多个地址吗?
  • 我们不想在主表中维护完整的地址。如果需要,我们将查询员工的完整地址。

标签: sql-server


【解决方案1】:

有3种情况:

  1. 10-1 关系(伪一对一)
  2. 1* 关系(一对多)
  3. ** 关系(多对多)

现在您应该决定选择哪一个。

如果一名员工可以有多个地址,您可以使用选项 2。

如果一个员工可以有多个地址,而一个地址可以有多个员工(从您的数据来看,这听起来可能是因为 2 名员工可以住在同一条街上的同一个城镇),那么您应该坚持选项 3。

如果以上都不是,那么请选择选项 1。

现在是这些选项的技术部分:

1)

create table Employees(employee_id int, --will be PK
                       first_name varchar(50)
                       last_name varchar(50)
                       ....)

create table EmployeeAddresses(employee_id int, --will be PK and FK on Employees.employee_id
                               town varchar(50)
                               street varchar(50)
                               ....)

2)

如果一名员工可以有多个地址:

create table Employees(employee_id int, --will be PK
                       first_name varchar(50)
                       last_name varchar(50)
                       ....)

create table EmployeeAddresses(address_id int, --will be PK
                               employee_id int, --will be FK on Employees.employee_id
                               town varchar(50)
                               street varchar(50)
                               ....)

如果一个地址可以有多名员工:

create table Employees(employee_id int, --will be PK
                       address_id int, --will be PK and FK on Addresses.address_id
                       first_name varchar(50)
                       last_name varchar(50)
                       ....)

create table Addresses(address_id int, --will be PK 
                       town varchar(50)
                       street varchar(50)
                       ....)

3)

create table Employees(employee_id int, --will be PK
                       first_name varchar(50)
                       last_name varchar(50)
                       ....)

create table Addresses(address_id int, --will be PK
                       town varchar(50)
                       street varchar(50)
                       ....)

create table EmployeeAddresses(employee_id int, --will be PK and FK on Employees.employee_id
                               address_id int, --will be PK and FK on Addresses.address_id)

【讨论】:

    【解决方案2】:

    我认为最好的解决方案是,当您为地址创建单独的表并链接到员工时。 例如:

    create table [Employee]
    (ID int not null
    , FirstName varchar(100) not null
    , LastName varchar(100) not null
    --...
    )
    go
    create table [Address]
    (ID int IDENTITY(1,1) not null
    , EmployeeID int not null
    , Street varchar(200)
    , Town varchar(200)
    --...
    )
    go
    ALTER TABLE [Address]  WITH CHECK ADD  CONSTRAINT [FK_Address_Employe] FOREIGN KEY(EmployeeID)
    REFERENCES [Employee] ([ID])
    go
    

    【讨论】:

      【解决方案3】:

      在 SQL Server Analysis Services 中,数据必须作为包含在案例表中的一系列案例提供给数据挖掘算法。然而,并不是所有的情况都可以用一行数据来描述。例如,一个案例可能来自两个表:一个包含客户信息的表,另一个包含客户购买的表。客户信息表中的单个客户可能在客户购买表中有多个项目,这使得使用单行描述数据变得困难。 Analysis Services 通过使用嵌套表提供了一种处理这些情况的独特方法。

      为了创建嵌套表,两个源表必须包含定义的关系,以便一个表中的项目可以与另一个表相关。在 SQL Server Data Tools (SSDT) 中,您可以在数据源视图中定义这种关系。有关如何定义两个表之间关系的详细信息,请参阅如何: 使用数据源视图设计器(分析服务)添加、删除、查看或修改逻辑关系。

      https://technet.microsoft.com/en-us/library/ms174835(v=sql.110).aspx

      【讨论】:

      • 这个问题涉及数据库引擎,而不是分析服务。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 1970-01-01
      • 2012-03-22
      • 2019-11-21
      • 2016-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多