繁体   English   中英

数据库设计:对数据感到困惑

[英]Database Design: Confused with data

我在Excel中为3个国家/地区提供了天气数据:英国,法国和瑞典。 数据是一年中的每一天,因此每个国家/地区为366行。

唯一标识符是日期。 例如,所有国家/地区的共享日期与“01/04/2012”相同,只是它们的信息不同。

首先,我为每个国家创建了3个不同的表格,但我想这样我仍然会重复相同的日期,我将不得不在网络系统中搜索不同的表格。

现在我想将所有数据放在一个表中并添加id和country列,但这会生成更多的数据及其1100行,这可能会在以后的实现中减慢我的系统速度。

您能告诉我如何设计它,以便每个日期都参考其自己的国家和数据,但不是一直重复日期? 也许一些外键......?

恕我直言,更好的设计方式应该是一个单独的表,国家和日期作为复合键。

这不会减慢您的系统速度,因为您可以在Country和Date列上构建索引。

从标准化系统的角度来看,一个更好的想法是使一个表具有[CountryId]列和[Country Name]列的[Country Name]

[CountryId]将作为主数据表中的FK参考。

你会有一张国家表

country
--------
country_id
name

和一张气象表

weather
----------
observation_date
country_id
observation

像这样的表

iso_country_code  observation_date  observation
--
GBR               2014-02-01        Clear
FRA               2014-02-01        Light rain
SWE               2014-02-01        Scattered clouds
GBR               2014-02-02        Snow
FRA               2014-02-02        Overcast
SWE               2014-02-02        Mostly cloudy
GBR               2014-02-03        Clear
FRA               2014-02-03        Snow
SWE               2014-02-03        Snow

只有一个非平凡的功能依赖。

{iso_country_code, observation_date}->observation

列{iso_country_code,observation_date}是唯一的候选键。 此表格为6NF。 没有规范化指南可以将其提升到更高的正常形式。

一个改进的例子

就目前而言,SQL语句INSERT INTO weather VALUES ('SWF', '2014-02-04', 'Snow'); 将成功提交,即使'SWF'显然是一个错字。 (没有国家/地区的ISO国家/地区代码为“SWF”。)

您可以通过创建有效国家/地区代码表并设置外键引用来增加列iso_country_code的数据完整性。 例如,如果您使用的是SQL,则可以这样做。

create table iso_country_codes (
  iso_country_code char(3) primary key,
  iso_country_name varchar(30) not null unique
);

insert into iso_country_codes values
('GBR', 'United Kingdom'),
('FRA', 'France'),
('SWE', 'Sweden');

alter table weather
add constraint 
foreign key (iso_country_code) references iso_country_codes (iso_country_code);

这与规范化无关 数据库设计的许多方面与规范化无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM