【问题标题】:How to normalize a database schema如何规范化数据库模式
【发布时间】:2012-03-06 17:28:39
【问题描述】:

我有两张桌子:

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

flight (
  flight_id(PK), 
  flightarrival, 
  flightdepart
)

我的问题是:

  • 架构有问题吗?
  • 如何向航班表添加数据?

我真的想将两者分开,因为批量表令人困惑。

以下是“批量表”的示例:

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

但我想对其进行规范化并将其与客户表分开并链接它们。

【问题讨论】:

  • 您能解释一下您所说的“批量表”是什么意思吗?
  • 包含大量数据的表或未规范化的表?对不起,我只是不知道我应该使用什么术语。 XD

标签: database database-design normalization


【解决方案1】:

您提出的架构意味着每个客户可能与一个(不为零,不超过一个)航班相关,这感觉不对。

本质上,我认为你有一个多对多的关系,你可以用三个表来做:

customer (id(PK), lastname, firstname)

flight (id(PK), flightarrival, flightdepart)

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

【讨论】:

  • 对于新记录,先插入customerflight,然后再插入customer_flight。 (实际上因为FK的关系,你不能用其他任何方式来做......)
  • 如果您已经有非规范化数据,您可以使用INSERT INTO ... SELECT DISTINCT ... 将其迁移到规范化。创建customer 表和flight 表。然后,您可以使用最终的 INSERT INTO ... SELECT ... 来填充您的 customer_flights 表,方法是将现有的非规范化表与两个新的 customerflight 表连接起来。
【解决方案2】:

您应该创建一个单独的交叉引用多目录表,如下所示

customer_flights(id int (pk),customer_id int, flight_id int,timecreated(可选))

一位客户可能在过去和将来预订了多个航班...

然后根据这个表中的记录连接两个表

【讨论】:

  • 先生,如果是这样的话,我的插入语句会是什么样子?
  • 我应该先插入customer表,然后插入flight表,再插入customer_flights?
  • 是的,customer表和Flight表都要先填!!!然后在这个多对多表中创建一条记录,该记录将从两个表中引用这些 ID。
  • 非常感谢先生。以及所有帮助过我的人现在对我来说更清楚了。先生,您介意回答另一个问题吗?我想到的东西会读到你的答案......
  • 继续问吧。这是什么?
猜你喜欢
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 2013-09-27
相关资源
最近更新 更多