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

时间:2014-02-04 16:21:41

标签: database sqlite database-design relational-database

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

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

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

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

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

3 个答案:

答案 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);

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