2015-10-13 80 views
0

我正在处理一个数据库设计,其中一个表链接到一个或另一个表,产生总共5个关系。如果该表链接到表1,则指向其他4个表的链接为NULL。如果我使用了5个外键,那么我将会得到瑞士奶酪!具有多个关系的数据库设计表

我有表格“中心”,它与区或县,或部门,村庄或城市相连。如果中心属于地区,则不能再属于州/部门/村庄/城市。

我不能只有一个属性“中心型”,它会显示中心链接的内容,因为我还需要知道区域,州等的哪个实例正好链接。

真诚,

RLO

+0

我认为一个更好的设计是中心类型的单个外键和指定中心值的另一列。两列,两个都是非空的。我认为你认为你的提案过于正常化是正确的。 – duffymo

+0

我不确定是否理解了答案。 问题如下。 我有6个表格(实体):中心,地区,州,部门,村庄,城市。 关系如下: 中心 - >区(对于区内的中心) 中心 - >州(针对州内的中心) 中心 - >部门(对于部门内的中心) 中心 - >城市(城市中心) 中心 - >村庄(村中心) 如果我创建表center_type,需要将“center_type”链接到州,村,市,部门。 。* – RLO

+1

听起来很糟糕的设计。 – duffymo

回答

0

类似的问题被问和在这里找到答案:https://dba.stackexchange.com/questions/113122/conditional-foreign-key-relationship/114281#114281

什么,你可以有一个中心表由是共同的村庄,城市等等数据。这包括中心的ID以及它是哪种中心的指示器:城市,州,村,区或部门。然后一个单独的桌子为每种中心用一个PK也是一个FK回中心表。

所以所有必须与中心有关系的实体都有一个FK到中心表,告诉你它是什么样的中心,因此哪个其他表包含关于该中心的附加信息。

+0

我的英文不够好,对不起。这个答案听起来不错。我对它的理解是: 我会有5个中间表(district_center,city_center,village_center等)。 这些respecitve表的FK将引用表中心。 这样,我会知道该中心属于哪个村/市/区等。 中心表中不会有FK。 中间表中的FK可以访问附加信息(无论是在城市/村庄/地区等)。 – RLO

0

你可能有两个,属性“中心型”(标识你与交易中心的哪种类型),以及id属性(让我们说“idCenter “),它链接中心类型的实例的id,以及两者的组合将告诉你中心的确切类型和链接的中心类型的实例。

中心型和idCenter是外键(这样你将有2 FK而不是5)。

编辑:其实这个答案有冗余。为每个不是中心的表创建单个FK会更好。例如,表区将具有以下属性:

disctrict(id_district,id_center,...)。

表村是:

村(id_village,id_center,...)。

在所有情况下,id_center都是以FK为中心。这样,你会知道,每个中心,它属于什么“中心型”(扔FK)。

+0

我不太确定是否理解了答案。 问题如下。 我有6个表格(实体):中心,地区,州,部门,村庄,城市。 关系如下: 中心 - >区(对于区内的中心) 中心 - >州(针对州内的中心) 中心 - >部门(对于部门内的中心) 中心 - >城市(城市中心) 中心 - >村庄(村庄内的中心) – RLO

+0

使用中间实体将中心连接到地区,州,部门,城市或村庄是否是一种好的做法? 我会有以下额外的表格:district_center(用于连接到分区的中心),city_center(连接到城市的中心),canton_center(连接到州的中心)等。 – RLO

+0

如果我们在谈论“多对多”关系。在这里,我们正在谈论一个“属于”关系,其中一个中心属于一个村庄或一个地区等。 严格正确的答案是为每个不是中心的表创建单个FK。例如,表区将具有以下属性: disctrict(id_district,id_center,...)。 表村将是: 村(id_village,id_center,...)。 在所有情况下,id_center都是以FK为中心。 这样,你会知道,每个中心,它属于什么“中心型”(扔FK)。 – Mundo

相关问题