我还没有看到你的表结构,所以我必须继续你的描述。这总是有风险的。
如果您的描述意味着页面和标签之间存在 1:M 关系,并且标签和属性之间存在 1:M 关系,那么起始关系的示例数据应该类似于下表。(起始关系总是包含所有表的所有属性。)我认为
- page_id 应该标识一个页面,
- tag_id 应该标识一个标签,并且
标记的属性取决于该标记出现的页面。(因此标签和属性之间不存在多值依赖关系。)
Table_A
page_id page_name tag_id tag_name attr_id
--
1 page1 1 tag1 attr1
1 page1 1 tag1 attr2
1 page1 2 tag2 attr1
1 page1 2 tag2 attr3
2 page2 1 tag1 attr1
2 page2 1 tag1 attr2
2 page2 2 tag2 attr1
2 page2 2 tag2 attr2
我们已经从您的描述中知道 page_id -> page_name 和 tag_id -> tag_name。(除非你想伤害自己,page_name -> page_id 和 tag_name -> tag_id 也是如此。)所以让我们根据这些知识来设计新表。
Table_C
tag_id tag_name
--
1 tag1
2 tag2
Table_B
page_id page_name
--
1 page1
2 page2
Table_A
page_id tag_id attr_id
--
1 1 attr1
1 1 attr2
1 2 attr1
1 2 attr3
2 1 attr1
2 1 attr2
2 2 attr1
2 2 attr2
Table_A 中保留了哪些功能、多值或连接依赖项?没有了。唯一的候选键是 {page_id, tag_id, attr_id}。我很确定这三个表都至少在 5NF 中。
因此,如果您对起始表进行规范化,您最终会得到“最后一个”表中的 page_id。(顺便说一句,它不再是一个真正的属性表了,是吗?)