2012-02-15 88 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