我在Excel中为3个国家/地区提供了天气数据:英国,法国和瑞典。数据是一年中的每一天,因此每个国家/地区为366行。
唯一标识符是日期。例如,所有国家/地区的共享日期与“01/04/2012”相同,只是它的不同信息。
首先,我为每个国家/地区创建了3个不同的表,但我想这样我仍然会重复相同的日期,并且我将不得不在Web系统中搜索不同的表。
现在我想将所有数据放在一个表中并添加id和country列,但这会产生更多的数据及其1100行的长度,这可能会在以后的实现中减慢我的系统速度。
您能告诉我如何设计它,以便每个日期都参考其自己的国家和数据,但不是一直重复日期?也许是一些外键......?
答案 0 :(得分:2)
恕我直言,更好的设计方式应该是一个单独的表,国家和日期作为复合键。
这不会减慢您的系统速度,因为您可以在Country和Date列上构建索引。
从标准化的系统角度来看,更好的想法是建立一个列为[CountryId]
列和[Country Name]
列的国家/地区。
此[CountryId]
将作为主数据表中的FK参考。
答案 1 :(得分:0)
你会有一张国家/地区表
country
--------
country_id
name
和天气表
weather
----------
observation_date
country_id
observation
答案 2 :(得分:0)
像这样的表
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);
这与无与规范化有关。数据库设计有很多方面与规范化无关。