不必要的规范化

jas*_*ski 10 mysql sql database database-design database-normalization

我和我的朋友正在建立一个网站并且存在重大分歧.该网站的核心是一个关于"人"的评论数据库.基本上人们可以输入评论,他们可以进入评论的人.然后,查看者可以在数据库中搜索注释中的单词或人名的部分内容.它完全由用户生成.例如,如果有人想对一个人姓名的拼错版本发表评论,他们可以,那就没问题.因此,可能有多个不同人的拼写被列为几个不同的条目(一些具有中间名,一些具有昵称,一些具有错误,等等),但这一切都可以.我们不在乎人们是否对随机人或想象的人做出评论.

无论如何,问题在于我们如何构建数据库.现在它只是一个表,注释ID作为主键,然后有一个关于评论的'人'的字段:

评论ID - 评论 - 人

1 - "他很奇怪" - 约翰史密斯

2 - "臭女孩" - 珍妮

3 - "同性恋" - 约翰史密斯

4 - "欠我20美元" - Jennyyyyyyyyy

一切都很好.使用数据库,我能够创建列出特定"人"的所有"评论"的页面.但是,他痴迷于数据库没有规范化.我读到了规范化并得知他错了.表IS当前已标准化,因为评论ID是唯一的并且指示"评论"和"人".现在他坚持认为'人'应该拥有自己的桌子,因为它是一个"东西".我不认为这是必要的,因为即使'人'真的是更大的容器(一个'人'可以对它们有很多'评论'),数据库似乎运行得很好,'人'是一个属性评论ID.我使用各种PHP调用来进行不同的SQL选择,使其在输出上神奇地显得更加复杂,以及用户可以搜索和查看结果的不同方式,但实际上,设置非常简单.我现在让用户用竖起大拇指向下评论评论,并在同一张桌子上保留一个"得分"作为另一个字段.

我觉得目前没有必要为独特的"人"条目设置单独的表格,因为"人"没有自己的"分数"或任何属性.只有评论.我的朋友是如此坚强,以至于效率是必要的.最后我说,"好吧,如果你想让我创建一个单独的表,让'人'成为它自己的领域,那么第二个字段是什么?因为如果一个表只有一个列,那似乎毫无意义.我同意我们以后可能会创建一个需要给'人'自己的桌子,但我们可以处理它." 然后他说字符串不能是主键,我们会将当前表中的'人'转换成数字,而数字将是新'人'表中的主键.对我来说,这似乎是不必要的,这将使当前的表更难阅读.他还认为以后创建第二张表是不可能的,而且我们现在需要预测到以后我们可能会需要它.

谁是对的?

Fra*_*kie 9

在我看来,你的朋友是对的.

人应该住在不同的桌子上,你应该尝试规范化.不过,不要过分.

从长远来看,你可能想要对你的网站做更多的事情,比如说你想把多个文件附加到一个人(即图片),你会非常感谢你的规范化.

  • 任何人都可以解释如何为任何功能依赖的左侧没有出现的属性创建一个代理键来规范化数据库吗?正如OP所说,Person决定什么(永远不会).您是否会为名为"Stuff"的属性提供相同的建议?这里可能存在规范化问题,但它不涉及Person. (2认同)

nvo*_*gel 8

为person创建一个新表并使用该表的键代替person属性与规范化无关.由于其他原因,这可能是一个好主意,但这样做并不会使数据库"更加规范化"而不是不这样做.所以你是对的:就规范化而言,创建另一个表是不必要的.