1

我猜这个问题已经被问过很多次了,我只是很难理解其他人的设计。

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

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

Borough 和 National Grid 参考等字段可以有多个值。例如,该项目可能位于多个行政区,并且可能有多个国家电网参考,这些参考列在以逗号分隔的每个字段中。

例如自治市镇:纽汉、哈克尼 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
(来自项目的主键和外键)
Borough 或 County

National Grid Ref table
Site_ID(来自项目的主键和外键)
NGR_SQ
NGR_Easting
NGR_Northing

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

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

我了解您将规范化表和原始项目表再次放在“视图”中。

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

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

感谢您的任何帮助。

4

1 回答 1

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

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

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

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

** 如果你在中间加逗号,它是否知道(你能告诉它)它是规范化的新记录。再次没有。

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

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

于 2013-06-24T15:18:04.887 回答