【问题标题】:How to split tables for effective database design?如何拆分表以进行有效的数据库设计?
【发布时间】:2015-03-26 15:54:07
【问题描述】:

假设我的数据库中有 3 个表,每个表代表一种特定类型的土地,并根据它们的大小进行区分。首先我有一条线,它代表最大的土地实体。每条线都包含许多较小的土地实体项目。每个项目都包含许多最小实体的地块。

我为他们每个人都创建了一个表格来存储他们的信息。但是,我注意到它们有一些共同的列,例如州、城镇和城市,而且这些列可能包含重复的信息:许多地块可以位于同一个州和城市,因此我们将在许多地方重复相同的信息行。

我有三个问题:

1- 如何有效地拆分表以避免冗余?我坚持只为地理信息创建一个新表,但是如何组织数据以避免该表中的冗余?

2- 由于一行包含许多项目,而项目本身包含许多地块​​;这意味着一条线包含许多图。然后我应该在情节与线和项目之间创建 FK 关系吗?

3- 如果我为地理信息创建另一个表,那么主键的好选择是什么? (为了在其他表中用作 FK)。

【问题讨论】:

    标签: database normalization


    【解决方案1】:

    1- 如何有效地拆分表以避免冗余?我 坚持只为地理信息创建一个新表,但是如何 组织数据以避免此表中的冗余?

    您可以创建一个address 表,其中包含idstatetowncity 字段以及一个复合唯一键,涵盖除id 之外的所有字段。您的每个地块表都将通过其 PK 引用此 address 表。只有当您有一些新的地址组合时,您才必须将数据插入此表中。但这会增加支持成本,我认为您不应该这样做。我可以接受这样的重复(假设你当然只在你的地块表中存储州、城市等的 ID)。

    2- 由于一行包含许多项目,而这些项目本身包含许多 地块;这意味着一条线包含许多图。那我应该 在 plot 和 line 和 project 之间创建 FK 关系?

    没有。除非您有充分的理由违反此规则,否则孩子通常应该只提及他们的直系父母。

    3- 如果我为地理信息创建另一个表,会是什么 一个好的主键选择吗? (为了在 其他表)。

    我相信代理主键在这里是可以的,如果你让你的表是这样的:idstate_idtown_idcity_id。但是,正如我所说,我认为这种程度的标准化是不必要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 2021-04-12
      • 1970-01-01
      • 2018-02-17
      • 2021-12-03
      相关资源
      最近更新 更多