我有一张记录许可证使用情况的表格。每个许可证使用都需要与用户和主机相关联。表定义如下所示。
create table if not exists per_user_fact
(
per_user_fact_id int unsigned not null auto_increment,
time_of_day char(16) not null,
license_served_id smallint unsigned not null,
license_hours numeric(10,2) not null,
role_name varchar(64) null,
user varchar(128) not null,
host varchar(128) not null,
primary key (per_user_fact_id),
foreign key (license_served_id) references served_license(served_license_id),
foreign key (user, host) references user_host(username, hostname)
);
我想规范化这个表,以便将重复的用户/主机值移动到这样的新表中。
create table if not exists user_host
(
username varchar(64) not null,
hostname varchar(128) not null,
primary key (username, hostname)
);
对于user_host表,我应该选择什么样的主键 - 自然或代理?我可以想到以下控制因素。
- 如果主键是自然的,即用户名和主机名的组合,则父表per_user_fact不需要额外的连接来查找用户名和主机名。
- 如果主键是自然的,则会浪费存储,因为用户名和主机名值将在两个表中重复。
- 如果主键是代理项,则父表将需要额外的连接来获取用户名和主机名的值。
- 如果主键是代理,对 user_host 表的索引会更快。
请指教。