尊重正常形式并为一个简单字段创建一个附加表真的更好吗?

问题描述 投票:0回答:1

我们组织跑步,我们希望保存跑步结果以及跑步者在其职业生涯中跑步的公里数。我们有一张表,其中包含每个跑步者的数据(姓名、年龄、性别等,包括 ID)。

我看到有两种保存其他数据的方法:

  • 还有两张桌子。第一个包含跑步长度和跑步 ID,第二个包含 3 列:跑步者 ID、跑步 ID 和跑步者位置。如果我是对的,这将尊重第二范式,没有重复。
  • 只有一张表,其中包含跑步者 ID、运行长度和跑步者位置。每个跑步者的跑步长度都会有重复(假设每次大约 20 次)。
拥有两个表会带来额外的好处,例如检索特定跑步的顺序或在跑步表中存储附加数据,但我们只需要检索跑步者的位置及其总行驶距离。在这种情况下,只有一个表看起来比拥有两个表

更优化,因为重复是针对一个字段(整数)并且避免存储整个表并引用其 Id。

我们只有两个整数要存储,一个用于跑步长度,一个用于跑步者的位置。因此,不存在大量重复数据。

打破第二范式,结果会不会更轻?

relational-database database-normalization
1个回答
2
投票
在我看来,它是三表数据模型(Oracle语法,但忽略它;原理在其他地方是一样的):

SQL> create table runner 2 (runner_id number primary key, 3 name varchar2(20) 4 ); Table created. SQL> create table run 2 (run_id number primary key, 3 name varchar2(20), 4 length number 5 ); Table created. SQL> create table rxr 2 (runner_id number references runner, 3 run_id number references run, 4 position number, 5 constraint uk_rxr unique (runner_id, run_id) 6 ); Table created. SQL>
如果只有

runner

并且
只有一张(额外的)桌子,那就是

SQL> create table oot 2 (runner_id number references runner, 3 length number, 4 position number 5 ); Table created.
这是一种选择,但比前一个更糟糕。您可以计算长度 - 这是事实 - 但您不知道发生的

where(在哪个运行中),因此无法收集任何其他统计信息。例如,哪首track是我最喜欢的曲目? (现在,有翁根男子回转比赛(高山比赛),这会增加我的数据的长度和位置,但是 - 在实际不知道场地的情况下 - 我无法比较赛道之间的跑步者(“我是翁根第二好的跑步者”)。


另一方面,您确定

run

(第一段代码中的第二个表)数据不会随时间变化吗?例如,在一级方程式赛车比赛中:伊莫拉有其 ID,赛道长度是众所周知的。但后来,他们决定用一个角制作两个角,并改变长度,所以即使我发布的第一个模型也会是错误的(有点)。将这些数据移到第三个表中怎么样?

SQL> drop table rxr; Table dropped. SQL> drop table run; Table dropped. SQL> create table run 2 (run_id number primary key, 3 name varchar2(20) 4 ); Table created. SQL> create table rxr 2 (runner_id number references runner, 3 run_id number references run, 4 run_date date, 5 length number, 6 position number, 7 constraint uk_rxr unique (runner_id, run_id) 8 ); Table created. SQL>


基本上,

三思而后行!创建长期适合您需求的数据模型,不要走捷径,因为它们最终可能会适得其反。

© www.soinside.com 2019 - 2024. All rights reserved.