[英]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.