2014-03-12 73 views
0

這是我的第一個計算器問題,所以我非常抱歉如果我沒有提出問題 - 請求禮節權。將兩個大的非規格化表分成多個表格並加上鍊接表

我有兩個非常混亂大的表稱爲中心及聯繫方法 - 一個人的公司和地址數據,以及其他有接觸,公司和地址數據:

中心:
-CompanyGUID(PK)
-CompanyName
-MainTelephone
-MainEmail
〜ADDRESS1
〜ADDRESS2
-Town
-Postcode

隱形眼鏡:
-ContactID(PK)
-FirstName
-LastName
-CompanyName
- 電話
-Email
〜ADDRESS1
- 地址2
- 城市
-Postcode
-Notes

我想這個數據移動到有聯繫人,公司和地址獨立的表和每個它們之間的連接表的新規範化的數據庫,讓許多一對多

公司:所有三個表之間的關係
-CompanyGUID
-CompanyName
-MainTelephone
-MainEmail
個 -Notes

隱形眼鏡:
-FirstName
-LastName
- 電話
-Email
-Notes

地址:
〜ADDRESS1
〜ADDRESS2
-Town
-Postcode

有表中有更多的列,但這也足以說明問題。許多公司和地址在兩個表中都是相同的,但不一定。

我需要維護聯繫人,公司和地址之間的現有關係,同時消除冗餘並允許公司和地址(companies_addresses鏈接表)以及聯繫人和公司(companies_contacts鏈接表)之間的多對多關係。

我看過幾個例子,將一張表分成兩個目標表,但我有三個,加上兩個鏈接表。這可能嗎?你會採取什麼方法?

非常感謝任何人誰可以提供幫助。

+0

SQL例如人... –

+0

編輯:我真的需要是將數據從兩個大表遷移所需要的複雜的SQL幫助同時保留數據之間的關係。 –

回答

1

我想你提出的五個表(公司,聯繫人,地址,companies_addresses,companies_contacts)就好。

我在想你是否真的有地址和公司之間的多對多關係。原來的餐桌中心只爲一家公司建議一個(主要?)地址。如果是這樣的話,跳過companies_addresses表並在表公司中添加一個外鍵。另一方面,在你的數據中你可能有多對多的關係。

您可能想保留聯繫人與他們的地址之間的關聯。 (也許你不需要這個,我只是在猜測)。在這種情況下,你需要在companies_addresses和contacts表之間建立一個鏈接表,而不是company_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); 
+0

是的,我需要允許公司和地址之間建立多對多的關係,因爲將來可能會有物理,郵政和帳單地址,相反還有可能共享地址的父母和/或子女組織。 –

+0

雖然你對聯繫人的想法很棒。這仍然會允許公司和聯繫人之間的多對多關係,對嗎? –

+0

是的,contact - companies_addresses鏈接表將允許公司和聯繫人之間的多對多關係。如果您只需要一對多關係,那麼您可以在表格聯繫人中添加適當的外鍵列。 – Agnieszka

相關問題