【发布时间】:2011-09-29 18:52:29
【问题描述】:
我有两张桌子:
爱好
+-------+-------+-------+-------+
| name |hobby1 |hobby2 |hobby3 |
+-------+-------+-------+-------+
| kris | ball | swim | dance |
| james | eat | sing | sleep |
| amy | swim | eat | watch |
+-------+-------+-------+-------+
tblavailable_hobby
+----------------+
| available_hobby|
+----------------+
| ball |
| dance |
| swim |
| eat |
| watch |
+----------------+
sql 查询应该获取 tblhobby 中的所有列,并将其与 tblavailable_hobby 匹配。如果所有爱好都与 available_hobby 匹配,则选择此人
查询应该产生
+--------+
| name |
+--------+
| kris |
| amy |
+--------+
请帮忙
感谢您的回答。我继承了这个数据库,目前无法对其进行规范化。但是,我想为这个问题添加另一个转折点。假设:
+-------+-------+-------+-------+
| name |hobby1 |hobby2 |hobby3 |
+-------+-------+-------+-------+
| kris | ball | swim | dance |
| james | eat | sing | sleep |
| amy | swim | eat | watch |
| brad | ball | | dance |
+-------+-------+-------+-------+
我想买
+--------+
| name |
+--------+
| kris |
| amy |
| brad |
+--------+
我将如何处理它?
【问题讨论】:
-
你的表的设计违反了3nf,你需要规范化tblHobby。
-
@JonH 它违反了1NF。 :)
-
@Shef:你错了,所有表似乎都在 1NF 中。评论this article:“许多作者误解了重复组的概念,并用它来声称某个表违反了 1NF。有些人 [错误地] 认为一组列(通常名称相似)相邻放置在一个表中相互连接,并且具有相同的数据类型构成一个'重复组'。”
-
@JonH:3NF 不是很有用。他们应该以 5NF 为目标。
-
@onedaywhen 对不起,伙计,但你是误解它的人。这不是文章描述的情况,这里的重复组违反了 1NF,因为它是与人相关的同一类型的数据。在这种情况下,这个人可以在没有爱好、有一个或两个爱好的情况下站立得很好。并非所有三列都是必需的。如果您参考文章中的示例,则所有列都是必需的。如果您仔细观察,列之间交换了相同的爱好,因此
hobby_1没有谈论一种爱好,而是重复列以适应值。