当前位置: 首页 > 知识库问答 >
问题:

使用链接表将两个大型非标准化表拆分为多个表

诸腾
2023-03-14

这是我的第一个问题,所以如果我没有正确的提问礼仪,我很抱歉。

我有两个非常凌乱的大表,叫做中心和联系人——一个有公司和地址数据,另一个有联系人、公司和地址数据:

中心:
-CompanyGUID(PK)
-CompanyName
-主电话
-主电子邮件
-地址1
-地址2
-城镇
-邮政编码
注意事项

联系方式:
-联系方式(PK)
-FirstName
-LastName
-CompanyName
-电话
-电子邮件
-地址1
-地址2
-城镇
-邮政编码
-注意事项

我试图将这些数据移动到一个新的规范化数据库中,该数据库有单独的联系人、公司和地址表,并在每个表之间链接表,以允许所有三个表之间的多对多关系:

公司:
-CompanyGUID
-CompanyName
-主电话
-主电子邮件
-注意事项

联系人:
-FirstName
-LastName
-phone
-Email
-Notes

地址:
-Address1
-Address2
-Town
-Postcode

表中还有更多的列,但这足以说明问题所在。两个表中的许多公司和地址相同,但不一定相同。

我需要维护联系人、公司和地址之间的现有关系,同时消除冗余,并允许公司和地址(公司\地址链接表)和联系人和公司(公司\联系人链接表)之间存在多对多关系。

我见过一些将一个表拆分为两个目标表的示例,但我有三个,外加两个链接表。这可能吗?你会采取什么方法

非常感谢任何能帮忙的人。

共有1个答案

栾越
2023-03-14

我认为你提出的五张表(公司、联系人、地址、companies_addresses、companies_contacts)很好。

我想知道你是否真的有地址和公司之间的多对多关系。原来的表中心建议只有一个(主要?)公司地址。如果是这样,请跳过表companies_addresses并在表公司中添加外键。另一方面,在数据中可能存在多对多关系。

您可能希望保持联系人与其地址之间的关联。(也许你不需要这个。我只是猜测。)在这种情况下,你需要一个公司地址和联系人表之间的链接表,而不是公司联系人表:联系人将与特定地址和公司相关联。

希望这能有所帮助。

这个解决方案的SQL如下:

-- tables
-- Table addresses
CREATE TABLE addresses (
    addressId int  NOT NULL,
    address1 varchar(255)  NOT NULL,
    address2 varchar(255)  NOT NULL,
    town varchar(255)  NOT NULL,
    postcode varchar(255)  NOT NULL,
    CONSTRAINT addresses_pk PRIMARY KEY (addressId)
);

-- Table companies
CREATE TABLE companies (
    companyGUID int  NOT NULL,
    companyName varchar(255)  NOT NULL,
    CONSTRAINT companies_pk PRIMARY KEY (companyGUID)
);

-- Table companies_addresses
CREATE TABLE companies_addresses (
    companies_companyGUID int  NOT NULL,
    addresses_addressId int  NOT NULL,
    CONSTRAINT companies_addresses_pk PRIMARY KEY (companies_companyGUID,addresses_addressId)
);

-- Table contacts
CREATE TABLE contacts (
    contactID int  NOT NULL,
    firstName varchar(255)  NOT NULL,
    lastName varchar(255)  NOT NULL,
    CONSTRAINT contacts_pk PRIMARY KEY (contactID)
);

-- Table contacts_companies_addresses
CREATE TABLE contacts_companies_addresses (
    contacts_contactID int  NOT NULL,
    companies_addresses_companies_companyGUID int  NOT NULL,
    companies_addresses_addresses_addressId int  NOT NULL,
    CONSTRAINT contacts_companies_addresses_pk PRIMARY KEY (contacts_contactID,companies_addresses_companies_companyGUID,companies_addresses_addresses_addressId)
);


-- foreign keys
-- Reference:  Table_5_contacts (table: contacts_companies_addresses)


ALTER TABLE contacts_companies_addresses ADD CONSTRAINT Table_5_contacts FOREIGN KEY Table_5_contacts (contacts_contactID)
    REFERENCES contacts (contactID);
-- Reference:  companies_addresses_addresses (table: companies_addresses)


ALTER TABLE companies_addresses ADD CONSTRAINT companies_addresses_addresses FOREIGN KEY companies_addresses_addresses (addresses_addressId)
    REFERENCES addresses (addressId);
-- Reference:  companies_addresses_companies (table: companies_addresses)


ALTER TABLE companies_addresses ADD CONSTRAINT companies_addresses_companies FOREIGN KEY companies_addresses_companies (companies_companyGUID)
    REFERENCES companies (companyGUID);
-- Reference:  contact_companies_addresses (table: contacts_companies_addresses)


ALTER TABLE contacts_companies_addresses ADD CONSTRAINT contact_companies_addresses FOREIGN KEY contact_companies_addresses (companies_addresses_companies_companyGUID,companies_addresses_addresses_addressId)
    REFERENCES companies_addresses (companies_companyGUID,addresses_addressId);
 类似资料:
  • 实现 (Implementation) 该算法的实现如下 - #include <stdio.h> #include <stdlib.h> #include <stdio.h> #include <stdlib.h> struct node { int data; struct node *prev; struct node *next; }; struct node *list

  • 实现 (Implementation) 该算法的实现如下 - #include <stdio.h> #include <stdlib.h> struct node { int data; struct node *next; }; struct node *even = NULL; struct node *odd = NULL; struct node *list = NULL; /

  • 实现 (Implementation) 该算法的实现如下 - #include <stdio.h> #include <stdlib.h> struct node { int data; struct node *next; }; struct node *even = NULL; struct node *odd = NULL; struct node *list = NULL; /

  • 现在我正在使用Criteria Hibernate查询从员工表中查询所有记录,它工作正常。我需要将员工表与库表联接,其中库。Emp_Id=员工。Emp_id我是否需要从员工表中获取所有记录,并从库表中获取书名和结账日期,作为联接选择查询的一部分。我该怎么做?

  • 问题内容: 我面临以下问题。我有一张非常大的桌子。该表是以前从事该项目的人员的传承。该表在MS SQL Server中。 该表具有以下属性: 它有大约300列。它们都具有“文本”类型,但是其中一些最终应表示其他类型(例如,整数或日期时间)。因此,在使用它们之前,必须先将这些文本值转换为适当的类型 该表有100余行。该表的空间很快将达到1 TB 该表没有任何索引 该表没有任何已实现的分区机制。 您可

  • 问题:给您两个非空链表,表示两个非负整数。数字按相反顺序存储,每个节点包含一个数字。将这两个数字相加,并将其作为链表返回。您可以假设这两个数字不包含任何前导零,除了0本身** 示例:工作测试用例如下:-输入:(2)- 我的解决方案不适用于以下测试用例: 输入: 单链表的定义: 这就是我的解决办法