1

我正在快速学习数据库设计的来龙去脉(截至一周前,这对我来说还是新事物),但我遇到了一些似乎不是很明显的问题,所以我希望得到一些澄清.

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

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

我可能完全错误地处理了这个问题,所以我会很感激任何关于在使用外键时如何最好地考虑表之间关系的好的经验法则。谢谢!

4

4 回答 4

2

如果一家公司有一个,而且只有一个地址,我要么将公司信息留在 Company 表中,要么在 Address 表中有一个 CompanyId 列,但无论如何,这似乎没有太多用处。如果数据确实与公司相关,并且没有在其他地方使用,那么那里有数据仍然是 3NF。

如果您想说出“帐单地址”和“送货地址”,那么将地址表与作为身份列的 AddressId 和引用到 Company 的 CompanyId 列分开会更有意义桌子。

但是,给您一个更一般的规则,“大师”是数据的真正“大师”。在这种情况下,主记录是一家公司,因此应引用其 ID。你需要有一个公司,然后才能有一个地址。

于 2010-05-11T15:19:27.797 回答
2

Think of it as a has or has many relationship. A company definitely has an address (in your example) so it should be the parent table and the address table should reference the company table. If, on the other hand, many different companies shared the same address, it could be the other way round. So it also depends on your needs (the logic you are trying to model).

于 2010-05-11T15:20:28.223 回答
1

如果每次删除公司时都想删除地址,这意味着地址直接依赖于公司,并且将地址保留在公司表中并不违反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

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

于 2010-05-11T15:19:25.480 回答
0

您没有正确执行此操作。您应该在地址表中有公司 ID,而不是公司表中的 addressid。这是因为关系实际上是一对多、一家公司、多个可能的地址(公司通常有多个地址)。这使得 company 成为父表。

于 2010-05-11T15:19:35.730 回答