数据库设计中哪个表应该是主人和孩子

时间:2010-05-11 15:15:50

标签: database database-design foreign-keys foreign-key-relationship

我正在快速学习数据库设计的细节(就像一周前一样,这对我来说是新的),但是我遇到了一些看起来不那么明显的问题,所以我希望能够得到一些澄清。

我正确的问题是外键。作为我设计的一部分,我有一个 Company 表。最初,我直接在表中包含了地址信息,但是,由于我希望实现3NF,我将地址信息分解到自己的表中,地址。为了保持数据完整性,我在 Company 中创建了一个名为“addressId”的行作为INT,而 Address 表具有相应的addressId作为其主键。

我有点困惑(或者我想确保我做的正确)是确定哪个表应该是主(引用)表,哪个应该是子(引用)表。当我最初设置它时,我将地址表作为主表,将 Company 表示为子表。但是,我现在认为这是错误的,因为每个公司应该只有一个地址,如果公司行被删除,我也希望删除相应的地址(CASCADE删除)。

我可能正在接近这个完全错误,所以我很欣赏在使用外键时如何最好地考虑表之间关系的任何好的经验法则。谢谢!

4 个答案:

答案 0 :(得分:2)

如果公司要拥有一个地址,并且只有一个地址,我会将公司信息留在公司表中,或者在地址表中有一个CompanyId列,但无论如何似乎没有多少实用性。如果数据真正与公司相关而未在其他地方使用,则在那里获取数据仍然是3NF。

如果你想说一个“账单地址”和一个“送货地址”,那么让一个地址表与一个标识列和一个被引用的CompanyId列的AddressId分开会更有意义。到公司表。

但是为了给你一个更通用的规则,“Master”是数据的真正“主”。在这种情况下,主记录是公司,因此应该引用其id。在你有地址之前,你需要有一家公司。

答案 1 :(得分:2)

将其视为有很多关系。 公司肯定地址(在您的示例中),因此它应该是父表,地址表应该引用公司表。另一方面,如果许多不同的公司共享相同的地址,那么它可能是相反的。所以它还取决于你的需求(你试图建模的逻辑)。

答案 2 :(得分:1)

如果您想在每次删除公司时删除该地址,这意味着该地址直接依赖于公司,并且保留公司表中的地址不会违反3NF

如果地址属性依赖于公司以外的其他东西,您可以将它们放入地址表中,以使地址管理在逻辑上更加一致。

说,您可以将地址拆分为country / region / town / street个部分,如果公司所在国家/地区的某个部分获得了独立性,您可以仅通过更改分离区域的country字段来更改地址

但是,这意味着您对实体中的地址感兴趣,而不是属性,并且您不应再级联删除它们。

<强>更新

在常规表单定义中,单词“依赖”表示“依赖于我的模型”

说,公司的地址是Wall Street, New York, NY, USA

如果模型中的 Wall Street取决于取决于New York NY的{​​{1}},请将其保存在单个表格中会违反USA

但是,如果模型中

  • 3NF是有效地址(这意味着您不会在此地址上引发错误)

  • 您更新公司的地址从来都不是一个有效的情况,因为您对其他公司也这样做(这意味着处理街道重命名或合并区域或进行其他地理更新不属于正常业务规则的一部分)

,然后带有地址的表格在Wall Street, New York, CA, USA

如果您希望在每次删除公司时删除地址,我会判断您不会跟踪地址依赖关系,因此,您可以将地址保留在公司表中。

答案 3 :(得分:0)

你没有正确地这样做。您应该在地址表中包含公司ID,而不是公司表中的地址ID。这是因为这种关系实际上是一对多,一家公司,一个以上的可能地址(公司通常有多个地址)。这使公司成为父表。