这是我的第一个stackoverflow问题,因此,如果我没有正确提出问题的礼节,我将非常抱歉。
我有两个非常混乱的大表,称为“中心和联系人”-一个具有公司和地址数据,另一个具有联系人,公司和地址数据:
中心:
-CompanyGUID(PK)
-公司名
-主电话
-MainEmail
-地址1
-地址2
-镇
-邮政编码
笔记
联系人:
-ContactID(PK)
-名字
-姓
-公司名
-电话
-电子邮件
-地址1
-地址2
-镇
-邮政编码
-笔记
我正在尝试将这些数据移动到新的规范化数据库中,该数据库具有用于联系人,公司和地址的单独表,并在每个表之间建立链接表,以允许所有三个表之间具有多对多关系:
公司:
-公司GUID
-公司名
-主电话
-MainEmail
-笔记
联系人:
-名字
-姓
-电话
-电子邮件
-笔记
地址:
-地址1
-地址2
-镇
-邮政编码
表中还有更多列,但这足以说明问题。两个表中的许多公司和地址都相同,但不一定。
我需要维护联系人,公司和地址之间的现有关系,同时消除冗余,并允许公司和地址(companies_addresses链接表)与联系人和公司(companies_contacts链接表)之间存在多对多关系。
我看到了一些将一个表分成两个目标表的示例,但是我有三个,加上两个链接表。这可能吗?你会采取什么方法?
在此先感谢任何可以提供帮助的人。
最佳答案
我认为您对五个表格(公司,联系人,地址,company_addresses,company_contacts)的建议是正确的。
我想知道您是否真的在地址和公司之间存在多对多关系。原始表格中心仅建议公司使用一个(主要?)地址。在这种情况下,请跳过companies_addresses表并在表company中添加外键。另一方面,在您的数据中,您可能具有多对多关系。
您可能需要保持联系及其地址之间的关联。 (也许您不需要这个。我只是在推测。)在这种情况下,您需要在companys_addresses和contacts表之间的链接表,而不是companys_contacts表:该联系人将与特定地址和公司相关联。
希望这可以帮助。
此解决方案的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);