我认为您对五个表(公司、联系人、地址、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);