SQL中的数据规范化(父子)

时间:2017-04-21 17:20:19

标签: sql sql-server

昨天我在一个SQL开发人员的位置进行了一次现场采访,面试官问我一个我无法令人信服地回答的问题。如果有人能帮助我找到正确的解决方案,我将不胜感激。

访谈员问:“我有一个应用程序和数据库,需要针对未来的应用程序开发进行规范化。目前,我有一个表(原始),我希望你转换为2个具有父子关系的表(Parent)和孩子)。

  

Original表的结构如下:

CREATE TABLE [dbo].Original(
   ID [varchar](11) NOT NULL,
   SourceDatabase [varchar](10) NULL,
   CompanyName [varchar](25) NULL,
   Address [nvarchar](30) NULL,
   City [char](25) NULL,
   State [char](2) NULL,
   Zip [char](9) NULL
)

--Test Data

 INSERT INTO [dbo].[Original]
                   ([ID]
                   ,[SourceDatabase]
                   ,[CompanyName]
                   ,[Address]
                   ,[City]
                   ,[State]
                   ,[Zip])
                   VALUES
                    ('1000000001','ORACLE', 'Microsoft', '123 ABC', 'EDISON', 'NJ', '10000' )
                  , ('1000000001','DB2', 'Microsoft', '123 ABC', 'EDISON', 'NJ', '10000' )
                  , ('1000000024','ORACLE', 'Microsoft', '456 ABC', 'EDISON', 'NJ', '10000' )
                  , ('1000000035','DB2', 'LinkedIn', '123 ABC', 'Mountain View', 'CA', '10056' )
                  , ('1000000002','MSSQL', 'GOOGLE', '456 9th Street', 'PROVIDENCE', 'RI', '10001' )
                  , ('1000000003','MSSQL', 'APPLE', '3100 EAST End Ave,Suite 70729', 'GREENWICH', 'CT', '10002' )

回答以下问题: -

  

1)定义父表和子表所需的属性是什么

     

2)LinkedIn是否拥有与Microsoft相同的父ID(LinkedIn是Microsoft的子公司)?

3)样本数据1,2和3是否具有相同的parent_ID? “

谢谢!

1 个答案:

答案 0 :(得分:1)

我同意@Sean,分成两个表是没有意义的。也许这是一个棘手的问题。在我看来,您需要将其拆分为4个表格,如下图所示:

enter image description here

您将地址与公司分开,因为公司可能会从公司表中共享相同的地址,参考地址。数据库进入他们自己的表。您可以通过公司和他们使用的数据库之间的多对多链接将这些结合在一起。

当然,这仍然是一种过度简化,因为你可以通过将城市/州划分为单独的表来进一步规范化整个地址......