我们组织跑步,我们希望保存跑步结果以及跑步者在其职业生涯中跑步的公里数。我们有一张表,其中包含每个跑步者的数据(姓名、年龄、性别等,包括 ID)。
我看到有两种保存其他数据的方法:
更优化,因为重复是针对一个字段(整数)并且避免存储整个表并引用其 Id。
我们只有两个整数要存储,一个用于跑步长度,一个用于跑步者的位置。因此,不存在大量重复数据。打破第二范式,结果会不会更轻?
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>
三思而后行!创建长期适合您需求的数据模型,不要走捷径,因为它们最终可能会适得其反。