【发布时间】:2011-04-10 19:00:59
【问题描述】:
我和我的朋友正在建立一个网站,但存在重大分歧。该网站的核心是一个关于“人”的 cmets 数据库。基本上人们可以输入评论,他们可以输入评论所涉及的人。然后查看者可以在数据库中搜索评论中的单词或人名的一部分。它完全是用户生成的。例如,如果有人想对拼写错误的人名发表评论,他们可以,这没关系。所以可能会有不同人的多个拼写被列为几个不同的条目(一些带有中间名,一些带有昵称,一些拼写错误等),但这一切都可以。我们不在乎人们是否对随机的人或虚构的人进行 cmet。
无论如何,问题在于我们如何构建数据库。现在它只是一个以评论 ID 作为主键的表,然后有一个字段用于评论的“人”:
评论 ID - 评论 - 人
1 - “他很奇怪” - 约翰·史密斯
2 - “臭女孩” - 珍妮
3 - “同性恋” - 约翰·史密斯
4 - “欠我 20 美元” - Jennyyyyyyyyy
一切正常。使用数据库,我能够创建列出特定“人”的所有“cmets”的页面。然而,他对数据库没有规范化很着迷。我阅读了规范化并得知他错了。该表目前已规范化,因为评论 ID 是唯一的,并且规定了“评论”和“人”。现在他坚持认为“人”应该拥有自己的表,因为它是“事物”。我认为没有必要,因为即使“人”确实是更大的容器(一个“人”可以有很多关于他们的“cmets”),数据库似乎运行得很好,“人”是评论 ID。我对不同的 SQL 选择使用各种 PHP 调用,以使其在输出和用户搜索和查看结果的不同方式上神奇地显得更加复杂,但实际上,设置非常简单。我现在让用户用竖起大拇指和大拇指向下的方式对 cmets 进行排名,并且我在同一张桌子上保留一个“分数”作为另一个字段。
我觉得目前没有必要为唯一的“人”条目单独设置一个表,因为“人”没有自己的“分数”或任何自己的属性。只有 cmets 可以。我的朋友如此坚持,以至于它是提高效率的必要条件。最后我说,“好吧,如果你要我创建一个单独的表,让'person'作为它自己的字段,那么第二个字段会是什么?因为如果一个表只有一个列,这似乎没有意义。我同意我们以后可能会需要给“人”它自己的桌子,但我们可以在那时处理。”然后他说字符串不能是主键,我们将当前表中的“人”转换为数字,数字将成为新“人”表中的主键。对我来说,这似乎没有必要,它会使当前表格更难阅读。他还认为以后创建第二个表是不可能的,我们现在需要预见到以后可能会需要它。
谁是对的?
【问题讨论】:
标签: mysql sql database database-design database-normalization