代码之家  ›  专栏  ›  技术社区  ›  JasCav

在数据库设计中,哪个表应该是主表和子表

  •  1
  • JasCav  · 技术社区  · 15 年前

    我很快就学会了数据库设计的进进出出(这对我来说是一个星期前的新事物),但是我遇到了一些看起来不太明显的问题,所以我希望能得到一些澄清。

    我有权问的问题是关于外用钥匙。作为我设计的一部分,我有一个 单位 表。最初,我把地址信息直接包含在表中,但是,由于我希望实现3nf,我把地址信息分解成了自己的表, 地址 . 为了保持数据完整性,我在 单位 作为int和 地址 表的主键为相应的AddressID。

    我有点困惑(或者我想确保我做的正确)的是确定哪个表应该是主(引用)表,哪个应该是子(引用)表。当我最初设置这个时,我 地址 表的主人和 单位 孩子。但是,我现在认为这是错误的,因为每个公司应该只有一个地址,如果删除了公司行,我也希望删除相应的地址(级联删除)。

    我可能是完全错误的,所以我很感激在使用外键时如何最好地考虑表之间的关系。谢谢!

    4 回复  |  直到 15 年前
        1
  •  2
  •   Klaus Byskov Pedersen    15 年前

    把它当作 有许多 关系。 绝对是一家公司 地址(在您的示例中),因此它应该是父表,地址表应该引用公司表。另一方面,如果许多不同的公司共享同一个地址,则可能是相反的。因此,它还取决于您的需求(您试图建模的逻辑)。

        2
  •  2
  •   Mitchel Sellers    15 年前

    如果一个公司要有一个地址,而且只有一个地址,我要么把公司信息留在公司表中,要么在地址表中有一个companyID列,但不管怎样,这似乎没有太多的实用性。如果数据确实与公司有关,而不是在其他地方使用,那么将数据放在那里仍然是3nf。

    如果您想说一个“账单地址”和一个“送货地址”,那么地址表与一个地址ID(标识列)和一个引用到公司表的CompanyID列分开会更有意义。

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

        3
  •  1
  •   Quassnoi    15 年前

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

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

    你可以把地址分成 country / region / town / street 如果公司所在国家的某个地区获得独立或其他原因,您只需更改 country 分离区域的字段。

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

    更新:

    在正常形式的定义中, “从属” 方法 “依赖于我的模型”

    比如,公司的地址是 Wall Street, New York, NY, USA .

    如果 在你的模型中 Wall Street 取决于 New York 这取决于 NY 这取决于 USA ,然后将其保存在单个表中会违反 3NF .

    然而,如果 在你的模型中 :

    • Wall Street, New York, CA, USA 是有效的地址(这意味着您不会在该地址上引发错误)

    • 你更新公司地址从来不是一个有效的情况。 只有 因为你也在对其他公司做同样的事情(这意味着像处理街道更名、合并地区或进行其他地理更新之类的事情不属于你 正常的 业务规则)

    ,则包含地址的表位于 3NF .

    从您每次删除公司时希望删除的地址来看,我认为您不会跟踪地址依赖关系,因此,您可以将地址保留在公司表中。

        4
  •  0
  •   HLGEM    15 年前

    你做得不对。地址表中应该有公司ID,而不是公司表中的地址ID。这是因为关系实际上是一对多、一个公司、多个可能的地址(公司通常有多个地址)。这使得公司成为父表。