【问题标题】:Splitting two large de-normalised tables into multiple tables with link tables将两个大型非规范化表拆分为具有链接表的多个表
【发布时间】:2014-03-12 16:45:19
【问题描述】:

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

我有两个非常混乱的大表,分别称为 Centers 和 Contacts - 一个包含公司和地址数据,另一个包含联系人、公司和地址数据:

中心:
-CompanyGUID (PK)
-公司名称
-主电话
-MainEmail
-地址1
-地址2
-城镇
-邮政编码
笔记

联系人:
-ContactID (PK)
-名字
-姓
-公司名称
-电话
-电子邮件
-地址1
-地址2
-城镇
-邮政编码
-笔记

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

公司:
-公司GUID
-公司名称
-主电话
-MainEmail
-笔记

联系人:
-名字
-姓
-电话
-电子邮件
-笔记

地址:
-地址1
-地址2
-城镇
-邮政编码

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

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

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

非常感谢任何可以提供帮助的人。

【问题讨论】:

  • SQL 示例有人吗?...
  • 编辑:我真正需要帮助的是从两个大表迁移数据所需的复杂 SQL,同时保留数据之间的关系。

标签: mysql sql sql-server database database-normalization


【解决方案1】:

我认为您对五个表(公司、联系人、地址、company_addresses、company_contacts)的建议很好。

我想知道地址和公司之间是否真的存在多对多关系。原始表格中心仅建议公司的一个(主要?)地址。如果是这种情况,请跳过 company_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);

【讨论】:

  • 是的,我需要允许公司和地址之间存在多对多关系,因为将来可能会有物理地址、邮政地址和帐单地址,相反,可能会有父和/或子组织分享地址。
  • 你对联系人的想法很棒。这仍然允许公司和联系人之间建立多对多关系,对吗?
  • 是的,联系人 - 公司地址链接表将允许公司和联系人之间的多对多关系。如果您只需要一对多的关系,那么您可以在表contacts中添加适当的外键列。
  • 谢谢,您的回答很有用。我没有将其标记为已接受的答案,因为我仍然对 SQL 代码的外观一无所知,我希望有人可以。我想投票,但我显然缺乏声誉。
  • 我已附上解决方案建议的 SQL。希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
相关资源
最近更新 更多