这个设计是5NF吗?

时间:2011-09-29 16:52:58

标签: relational-database

用户只能有一个博客(用户拥有博客)
博客可以有多个帖子 组只能有一个博客(但没有特定用户拥有博客,假设组所有者创建了博客,因此用户ID只是用户博客的属性而不是组博客,因此需要进行子类型化)

enter image description here

当删除group_blog_post时,也应删除基础blog_posts行,这是否最好使用触发器完成?

1 个答案:

答案 0 :(得分:1)

对于5NF的表格,它必须首先是4NF。要在4NF,它必须首先在3NF。依此类推,低至1NF。

松散地说,较低的正常形式与候选键和非素数属性之间的依赖关系有关。但我们可以看到的唯一非素数属性是“title”和“is_private”。所以真的没办法说出来。

以一个表为例,如果没有其他列,则“group_users”为5NF。

<强>后来

如果您像这样扩展表group_users

create table group_users (
  group_id integer not null references groups (group_id),
  user_id integer not null refrences users (user_id),
  user_type_id integer not null references user_types (user_type_id),
  primary key (group_id, user_id)
);
那时你还在5NF。 “user_type_id”列不仅仅依赖于user_id - 如果是,则不会是2NF。但user_type_id不是用户的属性;它是此特定组中用户的属性。没有部分密钥依赖;没有传递依赖;没有独立的,多价值的事实;没有连接依赖;所以它在5NF。

该结构每个组每个用户只允许一个user_type_id。如果您认为用户在每个组中应该有多个用户类型,那么

create table group_users (
  group_id integer not null references groups (group_id),
  user_id integer not null refrences users (user_id),
  user_type_id integer not null references user_types (user_type_id),
  primary key (group_id, user_id, user_type_id)
);

在5NF中也是。没有部分密钥依赖;没有传递依赖;没有独立的,多价值的事实;没有连接依赖;所以它在5NF。