Database design 标准化后如何显示回用户

Database design 标准化后如何显示回用户,database-design,primary-key,normalization,foreign-key-relationship,Database Design,Primary Key,Normalization,Foreign Key Relationship,我猜这已经被问过很多次了,我只是很难理解别人的设计 我正在学习数据库设计,刚刚阅读了《普通人的数据库设计》,现在正在读另一本书——Paul Dubois on MySQL——我很难理解如何在MySQL中处理规范化数据 在我们最初的Access数据库(设计糟糕!)中,我们有一个项目列表。 这些包括各种字段,例如站点ID(PK)、项目代码、项目名称、项目经理、自治区、国家电网参考等 区域和国家栅格参考等字段可以有多个值。 e、 g.该项目可以位于多个行政区,可以有多个国家电网参考,这些参考用逗号分隔

我猜这已经被问过很多次了,我只是很难理解别人的设计

我正在学习数据库设计,刚刚阅读了《普通人的数据库设计》,现在正在读另一本书——Paul Dubois on MySQL——我很难理解如何在MySQL中处理规范化数据

在我们最初的Access数据库(设计糟糕!)中,我们有一个项目列表。 这些包括各种字段,例如站点ID(PK)、项目代码、项目名称、项目经理、自治区、国家电网参考等

区域和国家栅格参考等字段可以有多个值。 e、 g.该项目可以位于多个行政区,可以有多个国家电网参考,这些参考用逗号分隔在每个字段中

e、 g。 自治区:纽厄姆,哈克尼 NGR:TQ 3692 8506、TQ 3768 8600、TQ 3756 8332、TQ 3880 8468

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

关于这一点,我有两个问题

第一个是关于键的,第二个是关于如何向用户显示数据

在《纯粹的凡人》一书中,它似乎表明您从第一个表(projects)中获取主键,并将其放入规范化表(Borough/county和NGR)中。它使用相同的键。它还使用与外键相同的键

项目表 站点ID(主键)
项目代码
项目名称
等等

自治县表
站点ID(项目的主键和外键)
区县

国家电网参考表
站点ID(项目的主键和外键)
NGR_SQ
NGR_Easting
北行

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

第二个问题是如何向用户显示标准化的表格

我知道您在“视图”中再次将标准化表和原始项目表放回一起

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

还是我完全错误地看待这一点,因为我习惯了一种卓越的做事方式


谢谢您的帮助。

这对我来说没有意义,因为它有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
第二个问题是如何向用户显示规范化的表? 在access中,这将根据用户界面和所使用的mySQL后端使用子表单来完成,这将基于将两个表连接在一起的查询来完成,并根据站点ID进行过滤

因此,如果用户选择Site_ID 1 那么你的查询,以获得该网站的自治县将是

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
我知道您在“视图”中再次将标准化表和原始项目表放回一起。 你可以,但你不必

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

*如果在TQ和3692之间加一个空格,它是否知道这是一个新字段* 没有

** 如果在两条记录之间加一个逗号,它是否知道(你能告诉它)这是规范化记录中的一条新记录。还是否

这就是为什么我问你在用什么用户界面

这里有三张主桌。项目、自治县和国家电网参考。
这些表中的每一个都有自己的创建、审阅、更新、删除(Crud)操作。现在,在项目表中,您可能会将项目链接到(一个或多个)自治县或国家电网参考。执行此操作时,您可以允许用户向国家电网/自治县添加新的不存在条目。如果UI设计得有效,它可以允许用户输入逗号分隔的列表或处理空格,但随后它必须将数据解析为正确的结构。UI/not数据库。执行此操作时,将一个条目添加到主表中,并将一个条目添加到关联表中(前面是我的结构中的项目)

这对我来说没有意义,因为它具有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
第二个问题是如何向用户显示规范化的表? 在access中,这将根据用户界面和所使用的mySQL后端使用子表单来完成,这将基于将两个表连接在一起的查询来完成,并根据站点ID进行过滤

因此,如果用户选择Site_ID 1 那么你的查询,以获得该网站的自治县将是

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
我知道您在“视图”中再次将标准化表和原始项目表放回一起。 你可以,但你不必

*我想使用视图作为从各种规范输入数据的一种手段