Database 如何拆分表以进行有效的数据库设计?

Database 如何拆分表以进行有效的数据库设计?,database,normalization,Database,Normalization,假设我的数据库中有3个表,每个表代表一种特定类型的土地,它们的大小不同。首先我有一条线,代表最大的土地实体。每条线包含许多项目,这些项目都是较小的土地实体。每个项目都包含许多图,这些图是最小的实体 为了存储他们的信息,我为他们每个人创建了一个表。但是,我注意到它们有一些共同的列,例如州、镇和城市,而且这些列可以包含重复的信息:许多地块可以位于同一个州和城市,因此我们将在许多行中重复相同的信息 我有三个问题: 1-如何有效拆分表以避免冗余?我考虑只为地理信息创建一个新表,但如何组织数据以避免此表中

假设我的数据库中有3个表,每个表代表一种特定类型的土地,它们的大小不同。首先我有一条线,代表最大的土地实体。每条线包含许多项目,这些项目都是较小的土地实体。每个项目都包含许多图,这些图是最小的实体

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

我有三个问题:

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

2-因为一条线路包含许多项目,而该线路本身包含许多地块;这意味着一条直线包含许多绘图。然后,我是否应该在绘图与直线和项目之间创建FK关系

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

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

您可以创建一个地址表,其中包含id、state、town和city字段以及复合唯一键,覆盖除id以外的所有字段。每个地块表都将通过其主键引用此地址表。只有当您有一些新的地址组合时,才需要将数据插入此表中。但这将增加支持成本,我认为您不应该这样做。我同意这样的复制,假设你只在你的地块表中存储州、城市等的ID

2-因为一行包含许多项目,而该行本身包含许多 情节;这意味着一条直线包含许多绘图。那我应该吗 在绘图与直线和项目之间创建FK关系

不可以。除非你有充分的理由违反这条规则,否则孩子们通常只能向他们的直系父母求助

3-如果我为地理信息创建了另一个表,会是什么 一个很好的主键选择吗?以便在中将其用作FK 其他桌子

我相信如果你把你的表做成这样的话,代理主键在这里是可以的:id,state\u id,town\u id和city\u id。但是,正如我所说的,我认为这种标准化的程度是不必要的