Post Normalization如何显示回用户

时间:2013-06-24 14:42:25

标签: database-design primary-key normalization foreign-key-relationship

我猜这已被多次询问我只是难以理解其他人的设计。

我正在学习数据库设计,刚刚阅读了数据库设计,我现在正在阅读另一本书 - 关于MySQL的Paul Dubois我很难理解如何在mysql中处理规范化数据。

在我们原来的Access数据库(设计糟糕!)中,我们有一个项目列表。 这包括各种领域,例如Site_ID(PK),项目代码,项目名称,项目经理,自治市镇,国家电网参考等。

像Borough和National Grid引用这样的字段可能有多个值。 例如该项目可以驻留在多个行政区,并且可以有多个国家网格参考,并且这些参考列在每个以逗号分隔的字段中。

e.g。 自治市镇:纽汉,哈克尼 NGR:TQ 3692 8506,TQ 3768 8600,TQ 3756 8332,TQ 3880 8468

易于列出但难以搜索。所以我把它们作为多值字段并从项目列表中取出并将它们放入自己的表中,称为Borough_County和National_grid_Reference表。

我对此有两个问题

第一个涉及密钥,第二个是如何将数据显示给用户。

在凡人书中,它似乎表明您从第一张表(项目)中取出主键并将其放入规范化表格(自治市/县和NGR)。它使用相同的密钥。它还使用相同的密钥作为外键。

项目表 Site_ID(PK)
项目代码
项目名称
等等。

Borough_County表
Site_ID(来自项目的主键和外键)
自治市镇或县

国家电网参考表
Site_ID(来自项目的主键和外键)
NGR_SQ
NGR_Easting
NGR_Northing

这对我来说没有意义,因为它有1:n的关系。 他们应该有自己的主键吗?

第二个问题是如何将规范化表格显示给用户?

据我所知,您将规范化表格和原始项目表格再次放在“视图”中。

我想使用View作为从各种规范化表格输入数据的方法。因为我们习惯于写作,例如NGR中的TQ 3692 8506,TQ 3768 8600等如何让数据库将值分离到正确的字段中? 如果你在TQ和3692之间放一个空格,它知道它是一个新领域吗?如果你之间放一个逗号,它知道(你能告诉它)它是规范化表中的新记录吗?

或者我是否以完全错误的方式看到这一点,因为我习惯于Excel的做事方式?

谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

这对我来说没有意义,因为它有1:n的关系。他们应该拥有自己的主键吗? 是的,但是他们还需要有一个关联表来解决多对多关系。

Projects Table 
Site_ID (PK)
Project Code
Project title
etc..

Borough_County table
BC_ID
Borough or County

National Grid Ref table
NGR_ID
NGR_SQ
NGR_Easting
NGR_Northing

Projects_Borough_county
BC_ID
Site_ID

Projects_National_Grid
NGR_ID
Site_ID

第二个问题是如何将规范化表格显示给用户? 在访问中,这将使用子表单完成取决于用户界面和正在使用的mySQL后端,这将基于将两个表连接在一起以在Site_ID上进行过滤的查询来完成

因此,如果用户选择Site_ID 1 然后你的查询获得该网站的Borough_County将是......

SELECT BC_ID, `Borough or county` 
FROM borough_County BC
INNER JOIN projects_Borough_county PBC on PBC.BC_ID=BC.BC_ID 
WHERE PBC.Site_ID = 1

我了解您将规范化表格和原始项目表格再次放在“视图”中。 你可以,但你不必。

* 我想使用View作为从各种规范化表格输入数据的方法。因为我们习惯于写作,例如NGR中的TQ 3692 8506,TQ 3768 8600等如何让数据库将值分离到正确的字段中? * 数据库不是您的用户界面(UI)必须的。现在更新虽然视图可能无法正常工作。取决于RDMBS / UI和一些其他因素;但它通常不是最好的设计。 (记录锁定可能会像更新多个表一样成为问题)

* 如果在TQ和3692之间放置一个空格,它是否知道它是一个新字段? *

** 如果你之间放一个逗号,它是否知道(你能否告诉它)它是规范化的新记录。再次编号

这就是我问你正在使用什么UI的原因。

这里有3张主要表格。 Projects,Borough_County和National Grid Ref。 这些表中的每一个都有自己的创建,审阅,更新,删除(Crud)操作。现在,在Projects表中,您可能会将项目链接到(一个或多个)Borough County或国家Grid References。在您执行此操作时,您可以允许用户向National Grids / Borough County添加新的不存在的条目。有效设计时,UI可以允许用户输入逗号分隔列表或处理空格,但是必须将数据解析为正确的结构。 UI /不是数据库。在执行此操作时,您向主表添加一个条目并向关联表添加一个条目(在上面的结构中以Projects_开头)