2012-02-15 86 views
2

我有兩個表:如何規範化數據庫架構

customer (
    client_id(PK), 
    lastname, 
    firstname, 
    flightID (Fk) 
) 

flight (
    flight_id(PK), 
    flightarrival, 
    flightdepart 
) 

我的問題是:

  • 是否有與該模式的任何問題?
  • 如何將數據添加到飛行表中?

我真的想分開這兩個,因爲大容量表很混亂。

這裏是一個「批量表」的一個例子:

customer(
    client_id(PK), 
    lastname, 
    firstname, 
    flightarrival, 
    flightdepart 
) 

,但我想正常化它,它從客戶表中分離,只是將它們鏈接。

+0

你能解釋一下你的「批量表」是什麼意思? – 2012-02-15 11:32:24

+1

表中有很多數據或非標準表?對不起,我只是不知道我應該用什麼術語。 XD – 2012-02-15 11:35:39

回答

3

您提出將意味着每個客戶可能與一個架構基礎上的記錄(不是零,不是m礦石比一個)飛行,這感覺不對。

從本質上說,我覺得你有許多一對多的關係,您可以用三個表做:

customer (id(PK), lastname, firstname) 

flight (id(PK), flightarrival, flightdepart) 

customer_flight (
    customer_id REFERENCES customer(id), 
    flight_id REFERENCES flight(id) 
) 
+0

對於新記錄,先插入'customer'和'flight',然後插入'customer_flight'。 (事實上​​,由於FK關係,你不能以其他方式做...) – zgpmax 2012-02-15 11:23:53

+0

如果你已經有非標準化的數據,你可以通過使用INSERT INTO ... SELECT DISTINCT將它遷移到標準化。 .'。創建'客戶'表和'飛行'表。然後,您可以使用最後一個「INSERT INTO ... SELECT ...」來填充您的customer_flights表,方法是將兩個新的'customer'和'flight'表連接到現有的非標準化表。 – zgpmax 2012-02-15 11:25:36

+0

非常感謝你先生。這真的幫助了我 – 2012-02-15 11:33:14

1

你應該創建一個單獨的交叉引用許多一對多 - 表,這將是像

customer_flights(ID INT(PK),CUSTOMER_ID INT,flight_id INT,timecreated(可選))

一個客戶可能在過去和未來預訂就像幾個航班...

,後來加入的兩個表在此表中

+0

先生,如果是這種情況,我的插入語句將如何? – 2012-02-15 11:19:52

+0

我應該先插入客戶表,然後插入航班表,然後插入customer_flights? – 2012-02-15 11:20:23

+0

是的,客戶表和飛行表都應該先填充!!!然後你在這個多對多表中創建一個記錄,它將引用這兩個表中的這些ID。 – 2012-02-15 11:21:50