数据库规范化的麻烦

时间:2013-12-02 17:47:31

标签: mysql database normalization

首先,如果这是一个有明显答案的问题,请让我提前道歉。我没有用谷歌搜索解决方案,因为我真的不知道谷歌会做些什么。

作为慈善组织成员的朋友,我为他建立了一个相当复杂的网站。当我收到该网站的原始规格时,他说他希望该工厂发布区域通讯。我已经在数据库中有一个regions表,因为组织内的兄弟会必须位于一个区域内。没问题,我毫不费力地实现了这一点。 newsletters表现在使用外键,并与id表中的相关regions相关联。

现在他回到我身边说他们也喜欢全国通讯的设施,我不太清楚该做什么。我已经考虑将外键列设置为0以表明它是一份全国性的时事通讯,但如果他确定他想要实施另一种类型的时事通讯会怎么样?我认为这通常是一个坏主意。

我考虑在newsletters表中添加一个额外的列,它会引用另一个表,它可能包含这些新类型,但这对我来说似乎有些奇怪,而且看起来有点像hackish。

我考虑将值复制到另一个表(包括区域)中,但我不禁觉得违反了规范化背后的原则。

我考虑过使用UNION,这可能会有效,但这意味着两个表都必须包含相同的列,这似乎过于严格,而且不太适合未来。

我想知道其他人如何应对这种情况,如果有人曾经不得不处理它。我希望我的应用尽可能具有前瞻性,我不想把自己画到任何角落,但到目前为止,我所想到的每一个解决方案都有一个缺点。

我真的很感激任何人都可以提供任何帮助。

非常感谢提前。

编辑:

典型!我刚刚发布,我有一个尤里卡时刻,但如果可能的话,我仍然会喜欢它的一些反馈。

newsletters表不应具有与区域相关的外键,因为它可以在没有区域的情况下存在。我认为每个时事通讯都有一个类型(区域和国家)列,然后我想有一个数据透视表,可以将任何区域时事通讯链接到适当的地区。

这对我来说很有意义,但我怀疑我的推理可能存在缺陷,所以如果有人愿意,我仍然会感激反馈。

非常感谢提前。

2 个答案:

答案 0 :(得分:2)

  

- “简报表现在使用与区域表中相关ID相关的外键。” -

我建议将新闻通讯和地区之间的关系多对多(通过映射表)。即使当前的现实是1对1或1对多。映射表将支持当前的现实。它将支持未来的案例,例如1个地区接收多个新闻通讯,或1个通讯发送到多个地区。听起来你正在制定一个生活规范,所以我会寻求灵活性。


  

- “他们也喜欢全国通讯的设施” -

“国家”是否定义为所有地区的总和?如果是这样,那么多对多关系可以通过数据支持国家通讯。不需要额外的“IsNational”标志。它可以灵活地制作出“1个或2个地区”的“几乎全国性”的新闻通讯。行为是通过数据控制的,而不是列。

更新:确保用户界面以方便的方式支持国家新闻通讯。允许他们轻松地将所有区域标记为1个动作的简报。

Table: Region
Cols: ID, RegionName, State, etc...

Table: NewsLetter
Cols: ID, NewsLetterName, ect...

Table: Map_Region_NewsLetter
Cols: ID, RegionID, NewsLetterID

答案 1 :(得分:1)

我要做的是有一个额外的表,比如newsletter_region,它有自己的ID,该地区的外键和新闻通讯的另一个。这样,如果此表中有条目,则表示该通讯是区域通讯,如果没有,则为国家通讯。

但要小心这种方法。第三种类型的新闻通讯可能会使您的数据库架构陷入混乱。我认为最好重新考虑架构并调整它以进行缩放。